您的位置:首页 > 其它

HDU 4552 怪盗基德的挑战书(kmp+dp)

2016-05-03 15:45 375 查看
Description

求一个字符串的所有前缀在串中出现的次数之和

Input

多组用例,每组用例占一行为一个长度不超过100000的字符串,以文件尾结束输入

Output

对于每组用例,输出该字符串的所有前缀在串中出现的次数之和,结果模256

Sample Input

aaa

abab

Sample Output

6

6

Solution

首先我们知道next数组中next[i]表示的是以第i个字符结尾的前缀中最长公共前后缀的长度,我们令dp[i]表示以第i个字符结尾的前缀中所含有以第i个字符结尾的前缀的个数,那么显然有dp[i]=dp[next[i]]+1,求出dp数组后累加即为答案

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 111111
int main()
{
char s[maxn];
int nex[maxn],dp[maxn];
while(~scanf("%s",s))
{
int len=strlen(s);
memset(nex,0,sizeof(nex));
for(int i=0,j=-1;i<=len;i++,j++)
{
nex[i]=j;
while(~j&&s[i]!=s[j])
j=nex[j];
}
int ans=0;
memset(dp,0,sizeof(dp));
for(int i=1;i<=len;i++)
{
dp[i]=dp[nex[i]]+1;
ans=(ans+dp[i])%256;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: