传送门
裸的kmp,只要next[i]*2<=i即可,要记录可行解方案数。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#define M 1000005
using namespace std;
char s[M];
int T,len,nxt[M],Nxt[M],cnt[M],ans;
int main(){
scanf("%d",&T);
while (T--){
scanf("%s",s+1);
len=strlen(s+1);
nxt[0]=Nxt[0]=-1;
for (int i=1;i<=len;i++){
int t=nxt[i-1];
while (t!=-1&&s[i]!=s[t+1]) t=nxt[t];
nxt[i]=t+1; cnt[i]=cnt[t+1]+1;
}
for (int i=1;i<=len;i++){
int t=Nxt[i-1];
if (t*2+2>i) t=nxt[t];
while (t!=-1&&s[i]!=s[t+1]) t=nxt[t];
Nxt[i]=t+1;
}
for (int i=ans=1;i<=len;i++)
ans=((long long)ans*(cnt[Nxt[i]]+1))%1000000007;
printf("%d\n",ans);
}
}