https://www.luogu.org/problemnew/show/P2375
跑两遍来初始化next与num;
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int M=1000005;
const long long OD=1000000007;
char a[M];
int n,t;
long long ans,p[M],j;
long long num(int s,int xx){
if(p[s]<=1) return p[s];
if(p[s]<=xx/2)
return 1+num(p[s],xx);
return num(p[s],xx);
}
void work(){
for (int i=1;i<n;i++){
while (j>0 && a[j+1]!=a[i+1]) j=p[j];
if (a[j+1]==a[i+1]) j++; p[i+1]=j;
ans=ans*(num(i+1,i+1)+1ll)*1ll%OD;
//printf("%d %lld\n",i+1,num(i+1,i+1));
}
}
int main(){
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%s",a+1);
n=strlen(a+1);p[1]=0;j=0;ans=1ll;
work();printf("%lld\n",ans);
}
return 0;
}