模仿KMP算法的思路递推.
#include <cstdio>
#include <cstring>
typedef long long ll;
const int N=1000010;
int n,l;
int f[N],g[N],h[N],num[N];
char s[N];
int main(){
scanf("%d",&n);
while(n--){
scanf("%s",s);
l=strlen(s);
for(int i=0;i<l;i++) f[i]=g[i]=h[i]=num[i]=0;
for(int i=1;i<l;i++){
int j=f[i-1];
while(j&&s[j]!=s[i]) j=f[j-1];
if(s[j]==s[i]){
f[i]=j+1;
g[i]=g[j]+1;
}
}
for(int i=1;i<l;i++){
int j=h[i-1];
while(j&&s[j]!=s[i]) j=f[j-1];
if(s[j]==s[i]){
h[i]=j+1;
if(h[i]>((i+1)>>1)) h[i]=f[h[i]-1];
num[i]=g[h[i]-1]+1;
}
}
ll ans=1;
for(int i=0;i<l;i++) ans=ans*(num[i]+1)%1000000007;
printf("%lld\n",ans);
}
return 0;
}