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
求一个字符串的所有前缀在串中出现的次数之和
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; }
相关文章推荐
- 航模的无刷电机到底是什么电机
- Android Studio 更新 Android 6.0 之后无法找到 org.apache.http 包的问题
- activiti 接收活动任务传递参数(九)
- JAVA数据压缩简单测试
- 点击键盘done按钮让键盘消失
- android学习,在项目上显示当前时间
- 修改进程用户相关信息
- 第六届蓝桥杯省赛(java)C组试题及参考答案
- python简单实现linux命令strings
- makefile include 文件中取当前路径的问题mark
- 判断有向图是否有环之拓扑排序-LeetCode 207. Course Schedule
- nyoj 1023 还是回文(dp)
- mysql中利用ceil函数对成绩进行分段统计
- centos7下安装sublime text3并配置环境变量
- 关于阿里 weex 的使用与案例
- mysql插入时unique字段重复插入失败
- 【VS开发】list控件的InsertColumn方法出错
- 《CSS3实战》笔记--渐变设计(一)
- spring核心容器
- Sql日期时间格式转换