HDU 2594 Simpsons’ Hidden Talents (KMP的F数组应用)
2015-07-17 10:38
435 查看
KMP中f数组意义:对于模式串的前i个字母构成的子串,这个子串会有一些前缀和后缀完全相同(包括长度),f[i]表示的就是这个最大的长度,而长度确定了前缀后缀就确定了。
对于这个题,如果将s1,s2连接成一个串c,c的长度为lc,那么f[lc]就是题目中要求的最大长度。
注意如果f[lc]大于la或lb,那么要修改成la和lb中的最小值lmin,至于为什么一定存在长度为lmin的相同前后缀,这个自己画一下图就知道了,思想就是对于后缀中的一部分对应着前缀中的一部分,而这部分在后缀中又对应前缀中的一部分,这样传递下去。
代码:
对于这个题,如果将s1,s2连接成一个串c,c的长度为lc,那么f[lc]就是题目中要求的最大长度。
注意如果f[lc]大于la或lb,那么要修改成la和lb中的最小值lmin,至于为什么一定存在长度为lmin的相同前后缀,这个自己画一下图就知道了,思想就是对于后缀中的一部分对应着前缀中的一部分,而这部分在后缀中又对应前缀中的一部分,这样传递下去。
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char a[50005]; char b[50005]; char c[100005]; int f[100005]; int main(){ while(~scanf("%s%s",a,b)){ int la=strlen(a); int lb=strlen(b); strcpy(c,a); strcat(c,b); int lc=strlen(c); f[0]=f[1]=0; for(int i=1;i<lc;i++){ int j=f[i]; while(j&&c[i]!=c[j]) j=f[j]; f[i+1]=(c[i]==c[j]?j+1:0); } int res=f[lc]; res=min(res,la); res=min(res,lb); if(res){ for(int i=0;i<res;i++){ printf("%c",c[i]); } printf(" %d\n",res); } else printf("%d\n",res); } return 0; }
相关文章推荐
- 字符串匹配-KMP算法学习笔记
- 进阶 非常可乐
- pat 1008. Elevator (20)
- Classifying plankton with deep neural networks
- 控件添加序号
- 字符串匹配-KMP算法学习笔记
- 强密码的正则
- Android studio 打jar包
- [LeetCode][Java] Valid Number
- Unity3d Assembly-CSharp.dll加密
- python转化exe工具 py2exe 0.6.9.win32-py2.7
- C/C++头文件一览
- Exception Handling Statements (C# Reference)
- switch
- 黑马程序员---ios学习日志5
- C#读取信息备份
- Object之克隆对象clone 和__clone()函数
- Android--混淆
- Android问题集锦
- ftp