题面
https://www.luogu.org/problem/P2375
题解
// luogu-judger-enable-o2 #include<cstdio> #include<iostream> #include<cstring> #define ri register int #define N 1000050 #define mod 1000000007 using namespace std; int T,nex[N],sum[N]; char s[N]; int main(){ scanf("%d",&T); for (ri ti=1;ti<=T;ti++) { scanf("%s",s+1); int l=strlen(s+1); nex[0]=nex[1]=0; for (ri i=2;i<=l;i++) { int j=nex[i-1]; while (j && s[j+1]!=s[i]) j=nex[j]; if (s[j+1]==s[i]) nex[i]=j+1; else nex[i]=0; } sum[0]=0; for (ri i=1;i<=l;i++) sum[i]=sum[nex[i]]+1; int j=0; long long ans=1LL; for (ri i=1;i<=l;i++) { while (s[j+1]!=s[i] && j) j=nex[j]; if (s[j+1]==s[i]) { j++; while (j*2>i) j=nex[j]; (ans*=(sum[j]+1))%=mod; } else j=0; } printf("%lld ",ans); } }