您的位置:首页 > 其它

hdu3336Count the string

2016-07-29 16:26 274 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336

给出一个字符串,求它的每一个前缀在整个字符串中出现的次数和

dp[i]代表以第i位结尾的字符串中包括多少以第i位字母结尾的前缀的出现次数

那么有dp[i]=dp[nxt[i]]+1

最后累加一下就好了

别忘了取模。

#include <stdio.h>
#include<cstring>
#include<iostream>
using namespace std;
int lb;
char b[200010];
int nxt[200010];
int dp[200010];
void gnx(){
int i=0,j=-1;
nxt[0]=-1;
while(i<lb){
if(j==-1||b[i]==b[j])nxt[++i]=++j;
else j=nxt[j];
}
}
int main(void)
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&lb);
scanf("%s",b);
memset(dp,0,sizeof(dp));
gnx();
int sum=0;
for(int i=1;i<=lb;i++){
if(nxt[i]==-1)dp[i]=1;
else dp[i]+=(dp[nxt[i]]+1);
dp[i]%=10007;
sum+=dp[i];
sum%=10007;
}
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kmp 字符串 dp