https://www.luogu.org/problem/show?pid=2375
因为有一个限制,我们不能简单的处理;
首先,当i满足限制条件时,对于i+1,我们如果用i的限制条件去更新i+1,那么i+1会有错误;
所以我们要先跑一边无限制的kmp,然后再去求出限制的kmp;
限制有两种;
一是限制next数组(p[])
一是限制sum数组;
这个见代码,都是大神帮我调的5555;
还有我的kmp要预处理i=1的情况;
这个好麻烦;
/*#include<iostream>
#include<cstdio>
#include<cstring>
#define Ll long long
using namespace std;
char s[2000001];
Ll p[1000005],sum[1000005],P[1000005];
Ll n,m,ans,mo=1000000007;
void make(char s[]){
p[1]=0;sum[1]=1;
for(int i=2;i<=m;i++){
int j=p[i-1];
while(j&&s[j+1]!=s[i])j=p[j];
p[i]=j;sum[i]=sum[j]+1;
// cout<<i<<' '<<sum[i]<<endl;
}
}
void make2(char s[]){
P[1]=0;
for(int i=2;i<=m;i++){
int j=p[i-1];
while((j*2+2>i)||(j&&s[j+1]!=s[i]))j=p[j];
if(s[j+1]==s[i])j++;
P[i]=sum[j];
}
}
int main()
{
scanf("%lld",&n);
while(n--){
scanf("%s",s+1);m=strlen(s+1);
make(s);
make2(s);
ans=1;
for(int i=1;i<=m;i++)ans=ans*(P[i]+1)%mo;
printf("%lld\n",ans);
}
}*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define Ll long long
using namespace std;
char s[2000001];
Ll p[1000005],sum[1000005],P[1000005];
Ll n,m,ans,mo=1000000007;
void make(char s[]){
p[1]=0;sum[1]=1;
for(int i=2;i<=m;i++){
int j=p[i-1];
while(j&&s[j+1]!=s[i])j=p[j];
if(s[j+1]==s[i])j++;
p[i]=j;sum[i]=sum[j]+1;
}
}
void make2(char s[]){
P[1]=0;
int j=0;
for(int i=2;i<=m;i++){
if(j*2+2>i)j=p[j];
while(j&&s[j+1]!=s[i])j=p[j];
if(s[j+1]==s[i])j++;
P[i]=sum[j];
}
}
/*void make2(char s[]){
P[1]=0;
for(int i=2;i<=m;i++){
int j=P[i-1];
if(j*2+2>i)j=p[j];
while(j&&s[j+1]!=s[i])j=p[j];
if(s[j+1]==s[i])j++;
P[i]=j;
}
}*/
int main()
{
scanf("%lld",&n);
while(n--){
scanf("%s",s+1);m=strlen(s+1);
make(s);
make2(s);
ans=1;
for(int i=1;i<=m;i++)ans=ans*(P[i]+1)%mo;
/*for(int i=1;i<=m;i++)ans=ans*(sum[P[i]]+1)%mo;*/
printf("%lld\n",ans);
}
}