根据kmp中的next数组的定义,用动态规划可以求得前缀出现的次数
题目链接:hdu3336
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int d[200005],n,nextt[200005];
char T[200005];
void getNext(){
int j, k;
j = 0; k = -1; nextt[0] = -1;
int tlen=strlen(T);
while(j < tlen)
if(k == -1 || T[j] == T[k])
nextt[++j] = ++k;
else
k = nextt[k];
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
scanf("%s",T);
getNext();
for(int i = 1; i <= n; i ++)
d[i] = 1;
d[0] = 0;
int sum = 0;
for(int i = 1; i <= n; i ++)
{
d[i] = d[nextt[i]] + 1;
sum += d[i]%10007;
}
printf("%d\n",sum%10007);
}
}