题目
![这里写图片描述](https://img-blog.csdn.net/20180312212114982?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk2NzA0MzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
题解
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int num=0;
char c=' ';
bool flag=true;
for(;c>'9'||c<'0';c=getchar())
if(c=='-')
flag=false;
for(;c>='0'&&c<='9';num=num*10+c-48,c=getchar());
return flag ? num : -num;
}
const int maxn=1000020;
const long long mod=1000000007;
string s;
int num[maxn],f[maxn];
void work()
{
f[0]=-1;f[1]=0;
num[0]=0;num[1]=1;
int j=0;
for(int i=1;i<s.length();i++)
{
while(j>=0&&s[i]!=s[j])
j=f[j];
f[i+1]=++j;
num[i+1]=num[j]+1;
}
j=0;
unsigned long long ans=1;
for(int i=1;i<s.length();i++)
{
while(j>=0&&s[i]!=s[j])
j=f[j];
j++;
while((j<<1)>(i+1))
j=f[j];
ans*=(unsigned long long)num[j]+1;
ans%=mod;
}
printf("%lld\n",ans);
}
int main()
{
int _=read();
while(_--)
{
cin>>s;
work();
}
return 0;
}