【题目链接】
https://www.lydsy.com/JudgeOnline/problem.php?id=3670
【算法】
KMP
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 1000010 const int P = 1e9 + 7; int T,i,j,ans,len,tmp; int num[MAXN],nxt[MAXN],cnt[MAXN]; char s[MAXN]; int main() { scanf("%d",&T); while (T--) { scanf("%s",s+1); len = strlen(s+1); nxt[1] = 0; cnt[1] = 1; j = 0; for (i = 2; i <= len; i++) { tmp = nxt[i-1]; while (tmp && s[tmp+1] != s[i]) tmp = nxt[tmp]; if (s[tmp+1] == s[i]) { nxt[i] = tmp + 1; cnt[i] = cnt[tmp+1] + 1; } else { nxt[i] = 0; cnt[i] = 1; } while (j && s[j+1] != s[i]) j = nxt[j]; if (s[j+1] == s[i]) j++; while (j > i / 2) j = nxt[j]; num[i] = cnt[j]; } ans = 1; for (i = 1; i <= len; i++) ans = 1ll * ans * (num[i] + 1) % P; printf("%d ",ans); } return 0; }