Codevs_P1425 最长公共子串(KMP)
2015-12-05 11:44
375 查看
题目描述 Description
输入N(2<=N<=20)个字符串,输出最长公共子串。
输入描述 Input Description
输入N
再输入N个字符串
输出描述 Output Description
输出最大公共子串。
样例输入 Sample Input
3
abce
cabk
jaab
样例输出 Sample Output
ab
简单KMP
输入N(2<=N<=20)个字符串,输出最长公共子串。
输入描述 Input Description
输入N
再输入N个字符串
输出描述 Output Description
输出最大公共子串。
样例输入 Sample Input
3
abce
cabk
jaab
样例输出 Sample Output
ab
简单KMP
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define N 105 int t,n,st,ll;bool flag; int l ,next ; //next正序 char s ,c ; //s正序 inline int creat(int fr,int l){ memset(s,0,sizeof(s)); memset(next,0,sizeof(next)); for(int i=fr;i<fr+l;i++){ s[i-fr]=c[st][i]; } int j=0,k=-1;next[0]=-1; while(j<l-1){ if(k==-1||s[j]==s[k]){ ++j,++k;next[j]=k; } else k=next[k]; } return 0; } inline int kmp(int k){ int i=0,j=0; while(i<l[k]&&j<ll){ if(j==-1||c[k][i]==s[j]){ ++j,++i; } else j=next[j]; } if(j==ll) return 1; return 0; } inline bool check(){ for(int i=1;i<=n;i++){ if(i!=st) if(!kmp(i)) return false; } return true; } int main(){ scanf("%d",&n);getchar();st=1;flag=false; memset(c,0,sizeof(c));memset(l,0,sizeof(l)); for(int i=1;i<=n;i++) { scanf("%s",c[i]);l[i]=strlen(c[i]); if(l[st]>l[i]) st=i; } for(ll=l[st];ll>0;ll--){ for(int j=0;j<=l[st]-ll;j++){ creat(j,ll); if(check()) {flag=true;break;} } if(flag) {printf("%s\n",s);break;} } if(!flag) printf("%s\n",s); return 0; }
相关文章推荐
- KMP算法的C#实现方法
- JavaScript中数据结构与算法(五):经典KMP算法
- 字符串算法--KMP--Java实现
- KMP算法(转载)
- kmp算法实现
- KMP算法详解
- linux kernel data struct: KMP算法实现
- 求一个字符串中连续出现次数最多的子串
- KMP算法总结
- KMP算法
- KMP字符串匹配算法
- 字符串匹配之KMP算法
- kmp
- 【hiho一下第三周】KMP计算模式串在原串出现次数
- HDU1711 模板题-KMP
- HDU1358:Period
- hdu1711
- POJ 2406 Power Strings
- KMP next[]数组
- kmp 学习 hihocoder #1015