题意:求字符串中所有前缀跟其相同的子串的总个数?
同样是KMP的应用
dp[i]代表的是从 最长前缀到最小前缀的匹配数
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
#define N 200010
char s[N];
int dp[N];
int nextval[N],len;
void getnext(const char*s){
int i=0,j=-1;
nextval[i]=j;
while(i!=len){
if(j==-1||s[i]==s[j]) nextval[++i]=++j;
else j=nextval[j];
}//while
}//getnext
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&len);
scanf("%s",s);
getnext(s);
memset(dp,1,sizeof(dp));
dp[0]=0;
int ans=0;
for(int i=1;i<=len;i++){
dp[i]=dp[nextval[i]]+1;
ans+=dp[i]%10007;
}printf("%d\n",ans%1007);
}//while
return 0;
}