poj 3450
题意:给你n个的串,求出它们的最长公共子串,如果不存在这个子串,则输出“IDENTITY LOST”,如果存在多个最长公共子串,则输出字典序最小的那一个。
代码:
#include<iostream>
#include<fstream>
using namespace std;
char c[4001][202];
int len[4001];
int next[210];
char str[210];
int n;
void getnext(char c[]){
int i,j,k;
int len=strlen(c);
j=0;k=-1;next[0]=-1;
while(j<len)
{
if(k==-1||c[j]==c[k])
next[++j]=++k;
else
k=next[k];
}
}
int kmp(){
int i,j,k;
getnext(str);
int lenn=strlen(str);
int maxx=202,minn;
for(i=1;i<=n;i++)
{
j=0;k=0;minn=0;
while(j<len[i]&&k<lenn)
{
if(k==-1||c[i][j]==str[k])
{
k++;j++;
}
else
k=next[k];
minn=max(minn,k);
}
maxx=min(maxx,minn);
}
return maxx;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s;
char re[202],tmp[202];
int ans;
while(cin>>n)
{
if(n==0) return ;
for(i=1;i<=n;i++)
{
cin>>c[i];
len[i]=strlen(c[i]);
}
ans=-1;
for(s=0;s<len[1];s++)
{
strcpy(str,c[1]+s);
j=kmp();
if(ans<j)
{
ans=j;
for(i=0;i<ans;i++)
re[i]=str[i];
re[i]='\0';
}
else
if(ans==j)
{
for(i=0;i<ans;i++)
tmp[i]=str[i];
tmp[i]='\0';
if(strcmp(tmp,re)<0)
strcpy(re,tmp);
}
}
if(ans==0)
cout<<"IDENTITY LOST"<<endl;
else
cout<<re<<endl;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号