1 4 abab
6
KMP+DP
next[i]=j表示0到j的字符串和i-j+1到i这段字符串相等。
dp[i]=dp[next[i]]+1;这个位置的跟之前的有过多少次匹配,仅仅要在原基础上加1就可以。
#include"stdio.h"
#include"string.h"
#define N 200005
#define M 10007
char s[N];
int dp[N],p[N];
void getnext(int m,char *t)
{
int i=0,j=-1;
p[0]=-1;
while(i<m)
{
if(j==-1||t[i]==t[j])
{
i++;
j++;
p[i]=j;
}
else
j=p[j];
}
}
int main()
{
int T,n,i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
scanf("%s",s);
getnext(n,s);
int ans=0;
for(i=1;i<=n;i++)
{
dp[i]=dp[p[i]]+1;
ans+=dp[i];
ans%=M;
}
printf("%d\n",ans);
}
return 0;
}
hdu 3336 Count the string,布布扣,bubuko.com
原文:http://www.cnblogs.com/hrhguanli/p/3775006.html