poj3450 Corporate Identity

来源:互联网 发布:ps软件破解版 编辑:程序博客网 时间:2024/06/06 03:19

题意:给你若干个字符串,求它们的最长公共子串。对于相同长度的最长公共子串,取字典序最小的那个。

思路:枚举第一个字符串的所有可能子串,对后面所有字符串进行匹配。

#include<iostream>#include<string>#include<algorithm>using namespace std;const int maxn=1001;bool kmp(string a,string b){int i,j;int fail[maxn];j=-1;memset(fail,-1,sizeof(fail));for(i=1;i<a.length();i++){                              while(j>-1 && a[j+1]!=a[i]) j=fail[j];if(a[j+1]==a[i]) j++;fail[i]=j;}j=-1;for(i=0;i<b.length();i++){while(j>-1 && a[j+1]!=b[i]) j=fail[j];if(a[j+1]==b[i]) j++;if(j==a.length()-1)    return 1;}  return 0;     } int main(){int n;string a[10001];while(cin>>n && n){for(int i=1;i<=n;i++)cin>>a[i];int maxlen=0;string maxsub;for(int f1=0;f1<a[1].length();f1++){string sub;int nowlen=maxlen;bool flag=1;                        while(flag && f1+nowlen<a[1].length()){nowlen++;sub=a[1].substr(f1,nowlen);     for(int i=2;i<=n;i++){if(!kmp(sub,a[i])) {flag=0;nowlen--;break;}}}if(nowlen>maxlen){maxlen=nowlen;maxsub=a[1].substr(f1,nowlen);}else if(nowlen==maxlen){flag=1;sub=a[1].substr(f1,nowlen);if(sub.length()==nowlen){for(int i=2;i<=n;i++)if(!kmp(sub,a[i])){flag=0;break;}if(flag && (sub<maxsub))maxsub=sub;}}}if(maxlen==0) cout<<"IDENTITY LOST"<<endl;else cout<<maxsub<<endl;}return 0;}


 

 

原创粉丝点击