HDU 3336 Count the String(KMP+DP)
2017-01-30 10:47
363 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3336
题意:给出一个字符串,计算所有前缀在字符串中出现的次数。
思路:考虑KMP的next[]来解题。next[i]=j表示最大的j使得0~j==i-j~i。
对于样例的next[]分析如下:
0 1 2 3
a[] a b a b
next[] -1 0 0 1
dp[i]表示子串a[0~i]共含有以a[i]为结尾的前缀的数目,则以a[i]结尾的前缀数就是自己本身加上以a[next[i]]结尾的前缀数,即dp[next[i]]。
题意:给出一个字符串,计算所有前缀在字符串中出现的次数。
思路:考虑KMP的next[]来解题。next[i]=j表示最大的j使得0~j==i-j~i。
对于样例的next[]分析如下:
0 1 2 3
a[] a b a b
next[] -1 0 0 1
dp[i]表示子串a[0~i]共含有以a[i]为结尾的前缀的数目,则以a[i]结尾的前缀数就是自己本身加上以a[next[i]]结尾的前缀数,即dp[next[i]]。
#include<iostream> #include<cstring> using namespace std; const int maxn = 200000 + 5; int n; char a[maxn]; int next[maxn]; int dp[maxn]; void get_next() { int i = -1, j = 0; ::next[0] = -1; int l = strlen(a); while (j < l) { if (i == -1 || a[i] == a[j]) ::next[++j] = ++i; else i = ::next[i]; } } int main() { //freopen("D:\\txt.txt", "r", stdin); int t; cin >> t; while (t--) { cin >> n; cin >> a; get_next(); memset(dp, 1, sizeof(dp)); dp[0] = 0; int sum = 0; for (int i = 1; i <= n; i++) { dp[i] = dp[::next[i]] + 1; sum += dp[i] % 10007; } cout << sum % 10007 << endl; } return 0; }
相关文章推荐
- 简介SWT Jface
- 摄像头标定入门资料整理
- 共同学习Java源代码-数据结构-AbstractMap抽象类(三)
- 内核开发:实现切换窗口后的键盘输入
- Linux中常用操作命令
- 【Untiy&摄像机视角】
- 我的Java编码规范
- 链表逆置
- 《JavaScript高级程序设计》--创建对象1
- SSM框架注解整合
- 《JavaScript高级程序设计》--继承
- HTML ---表格
- bzoj2594
- Android获取状态栏高度、标题栏高度、编辑区域高度的获取
- 操作系统面试常问
- hiho 第135周 九宫
- SQL递归查询知多少
- Java中的垃圾回收原理
- Unity的Shader如何控制投影颜色
- Octave及其工具包的安装