题意:给你若干个字符串,求它们的最长公共子串。对于相同长度的最长公共子串,取字典序最小的那个。
思路:枚举第一个字符串的所有可能子串,对后面所有字符串进行匹配。
#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;
}