1 4 abab
6
#include <cstdio>
#include <cstring>
char stu1[200001];
char stu2[200001];
int next[2000001];
int n;
int count;
void makeNext()
{
int q,i;
next[0]=0;
for(i=1,q=0;i<n;++i)
{
while(q>0 && stu1[i]!=stu1[q])
{
q=next[q-1];
}
if(stu1[i]==stu1[q])
{
++q;
}
next[i]=q;
}
}
int kmp(int x)
{
int sum=0;
int q,i;
for(i=x,q=0;i<n;++i)
{
while(q>0 && stu1[i]!=stu2[q])
{
q=next[q-1];
}
if(stu1[i]==stu2[q])
{
++q;
}
if(q==x)
{
q=0;
sum++;
}
}
return sum;
}
int main()
{
int t,i,k;
while(~scanf("%d",&t))
{
while(t--)
{
scanf("%d",&n);
getchar();
scanf("%s",stu1);
makeNext();
stu2[0]=stu1[0];
count=0;
for(i=1;i<n;++i)
{
stu2[i]=stu1[i];
k=kmp(i);
if(k==0)
break;
else
{
count+=k;
if(count>10007)
count%=10007;
}
}
count+=n;
if(count>10007)
count%=10007;
printf("%d\n",count);
}
}
return 0;
}
原文:http://blog.csdn.net/kuangzhenxi/article/details/18330531