hdu 3336
KMP+dp
经典
#include<stdio.h>
#include<string.h>
#define mod 10007
char t[200010];
int next[200010];
int num[200010];
int cnt;
void get_next(char T[],int len,int next[])
{
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1 || T[i]==T[j])
{
j++;
i++;
next[i]=j;
}
else
j=next[j];
}
}
void main()
{
int cas,len,i;
scanf("%d",&cas);
while(cas--)
{
memset(num,0,sizeof(num));
cnt=0;
scanf("%d",&len);
scanf("%s",t);
get_next(t,len,next);
num[1]=0;
for(i=2;i<=len;i++)
{
if(next[i]>0)
num[i]=(num[next[i]]+1)%mod;
}
int j=0;
for(i=2;i<=len;i++)
j=(j+num[i])%mod;
printf("%d\n",(j+len)%mod);
}
}
浙公网安备 33010602011771号