这个题是KMP;
然后比较坑;
我们记录当前这个位置的 sum[] 是从那个位置转移过来的;
然后我们在求 next 的时候;
顺便把这个数组更新;
显然它会顺着位置前移;
最多一位;
#include "iostream"
#include "stdio.h"
#include "algorithm"
#include "cstring"
#define II int
#define C char
#define LO long long
#define R register
#define I 1324567
#define PI 1000000007
using namespace std;
II next[I], ko[I], wei[I];
C a[I];
II n,len,t;
LO ans;
void q_next()
{
next[0]=wei[0]=-1;
R II we=0;
for(R II i=1;i<=len;i++)
{
if(a[i]==a[next[i-1]+1]) {
next[i]=next[i-1]+1;
we=i-1;
} else {
R II op=next[i-1];
while (op!=-1 && a[i]!=a[op+1]) {
we=op;
op=next[op];
}
next[i]=op+1;
}
ko[i]=ko[next[i]]+1;
we=wei[we];
while (we!=-1 && (we*2+2>i || a[we+1]!=a[i])) {
we=next[we];
}
wei[i]=we+1;
ans*=ko[we+1]+1;
ans%=PI;
}
}
int main()
{
// freopen("1.in","r",stdin);
scanf("%d",&t);
while (t--) {
ans=1;
scanf("%s",a+1);
len=strlen(a+1);
for(R II i=1;i<=len;i++)
{
next[i]=0;
wei[i]=0;
ko[i]=0;
}
q_next();
printf("%lld\n",ans);
}
exit(0);
}