HDU3336 Count the string KMP+递推
2016-03-26 12:28
337 查看
题意:T组测试数据,给你一个字符串,求其前缀出现过的次数之和。例如 : abab 前缀 a 出现过两次,前缀 ab 出现过两次,前缀 aba 出现过一次,前缀 abab 出现过一次,所有前缀和为 6 ,故输出6。
思路:本题的重点在于对 next 数组的理解上,next 表示了在第 i 个字符时能匹配的最长前缀,更多关于 next 数组的含义请参考 KMP算法 的解析。对于这道题,我们只需要记录一下每个前缀所包含的次长前缀加上他本身就可以了。即递推式如下: F[i]=F[NEXT[i]]+1 ,i(1,n) 这样我们就不会有遗漏的情况出现了。最后我们用 sum = F[1]+F[2]+……+F
统计所有的前缀和即可。
代码如下:
思路:本题的重点在于对 next 数组的理解上,next 表示了在第 i 个字符时能匹配的最长前缀,更多关于 next 数组的含义请参考 KMP算法 的解析。对于这道题,我们只需要记录一下每个前缀所包含的次长前缀加上他本身就可以了。即递推式如下: F[i]=F[NEXT[i]]+1 ,i(1,n) 这样我们就不会有遗漏的情况出现了。最后我们用 sum = F[1]+F[2]+……+F
统计所有的前缀和即可。
代码如下:
#include <iostream> #include <cstring> using namespace std; void Op_NEXT(char *p,int *NEXT){ NEXT[0] = -1; int k = -1; int j = 0; int m=strlen(p); while(j < m){ if(k == -1 || p[k] == p[j]){ k++; j++; NEXT[j]=k; } else k=NEXT[k]; ///回溯 } } int main() { ios::sync_with_stdio(false); int T; cin>>T; int NEXT[200005]; char p[200005]; int dp[200005]; while(T--){ memset(dp,0,sizeof(dp)); int n; cin>>n; cin>>p; Op_NEXT(p,NEXT); int sum=0; for(int i=1;i <= n;i++){ dp[i]=dp[NEXT[i]]+1; sum += dp[i]; sum %= 10007; } cout<<sum<<endl; } return 0; }
相关文章推荐
- 【杭电-oj】-1236排名-(结构体应用)
- 什么是SVG和SVG常用的形状
- Hexo静态博客搭建教程
- 使用fluentd管理docker日志
- 软考中高项学员:2016年3月23日作业
- 【02单表查询】——02:TOP
- 经典算法面试题(二)
- POJ2524 Ubiquitous Religions(并查集)
- QT 的 Graphics View 系统
- 很简单的JAVA反射教程
- Linux下LVS搭建负载均衡集群
- Android-ImageView的属性
- 双链表的各种基本运算
- 算法训练 未名湖边的烦恼
- Code::blocks报错Can't find compiler executable in you……
- LeetCode-89-Gray Code(模拟/递归)-Medium
- 子数组最大值设计02
- centos mysql忘记密码
- 算法训练 数字三角形
- linux 命令