您的位置:首页 > 其它

hdu3336(KMP+DP)

2015-08-20 17:56 162 查看
题意:求字符串中所有前缀跟其相同的子串的总个数?

同样是KMP的应用

dp[i]代表的是从 最长前缀到最小前缀的匹配数

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
#define N 200010
char s
;
int dp
;
int nextval
,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: