HDU 4763 Theme Section(KMP)
2015-09-22 19:22
381 查看
题意:给出一个字符串,求出最长的E,使得字符串可以表示成EAEBE的形式,A,B可以为任意字符串。
思路:KMP水题,但对理解KMP算法有很大帮助。
首先计算出字符串的失配函数f,f[i]的值表示的就是i-1位置结束的字符串和前缀的最大匹配长度,那么我们每次在中间的那块找出长为f[i]的前缀,如果能找到,就是答案,否则回溯到f[f[i]]。
思路:KMP水题,但对理解KMP算法有很大帮助。
首先计算出字符串的失配函数f,f[i]的值表示的就是i-1位置结束的字符串和前缀的最大匹配长度,那么我们每次在中间的那块找出长为f[i]的前缀,如果能找到,就是答案,否则回溯到f[f[i]]。
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<map> #include<set> #include<ctime> #define eps 1e-6 #define LL long long #define pii pair<int, int> //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const int MAXN = 1000100; char P[MAXN]; int f[MAXN]; void getFail(char* P) { int m = strlen(P); f[0] = 0; f[1] = 0; for(int i = 1; i < m; i++) { int j = f[i]; while(j && P[i]!=P[j]) j = f[j]; f[i+1] = P[i]==P[j] ? j+1 : 0; } } bool find(char* T, char* P, int n, int m) { //int n = strlen(T), m = strlen(P); int j = 0; for(int i = 0; i < n; i++) { while(j && P[j]!=T[i]) j = f[j]; if(P[j] == T[i]) j++; if(j == m) return true; } } int main() { //freopen("input.txt", "r", stdin); int T; cin >> T; while(T--) { scanf("%s", P); getFail(P); int len = strlen(P); int ans = f[len]; while(ans && (ans>len/3||!find(P+ans, P, len-2*ans, ans))) ans = f[ans]; cout << ans << endl; } return 0; }
相关文章推荐
- Unity3D学习笔记(八) 动画编辑器(animation窗口)
- 在网上看到的一个挺好的Map排序
- 深入浅出百度地图API开发系列(3):模块化设计
- 使用元组实现单次方法调用返回多个对象
- birt+maven+web
- Unix环境编程学习笔记----如何理解套接字缓冲区???? ?其作用和原理是什么???
- 开源控件滚动选择器WheelView学习笔记 & 省市区联动选择器
- pLSA/mixture unigram/gmm em算法公式汇总
- 算法导论11.1直接寻址表 练习总结
- An exception has occurred while using the formatter ‘JsonMediaTypeFormatter’ to generate sample
- 常见的网络图像格式有哪些,在HTML中各适合什么场合?
- UI07_界面传值
- 百度地图功能介绍、申请秘钥的方法、配置环境的步骤
- 苹果开发 笔记(81)ios 调用微信分享链接
- $.type源码分析
- 高效开发Android App的10个建议
- C#同步数据库的数据到Neo4J
- java上传文件到局域网内的另一台计算机上
- 用c语言统计一个字符串中有多少个数字字符
- chmod命令详细用法