题目链接: HDU http://acm.hdu.edu.cn/showproblem.php?pid=2328
POJ http://poj.org/problem?id=3450
#include<iostream> #include<cstring> #include<string> #include<cstdio> using namespace std; const int maxn=4444; char x[222],ans[222]; char f[maxn][222]; int next[222]; void strcpy(char *y,int i,int len){ for(int j=0;j<len;++i,++j) x[j]=y[i]; x[len]=' '; } void Get_Next(char *s){ int len=strlen(s); next[0]=-1; int i=0, j=-1; while(i<len){ if(j==-1||s[i]==s[j]){ if(s[++i]==s[++j]) next[i]=next[j]; else next[i]=j; } else j=next[j]; } } bool KMP(char *s,char *a){//cout<<1<<endl; int ls=strlen(s), la=strlen(a); Get_Next(a); int i=0, j=0; while(i<ls&&j<la){ if(j==-1||s[i]==a[j]) ++i,++j; else j=next[j]; } if(j>=la) return true; return false; } int main(){ int n; while(~scanf("%d",&n),n){ for(int i=0;i<n;++i) scanf("%s",f[i]); int len=strlen(f[0]); bool flag=false; ans[0]=' '; for(int i=len;i&&!flag;--i) for(int j=0,k;j<=len-i;++j){ strcpy(f[0],j,i); for(k=1;k<n;++k) if(!KMP(f[k],x))break; if(k==n)//cout<<x<<endl; if(!flag||strcmp(ans,x)>0){ strcpy(ans,x); flag=true; } } if(flag) puts(ans); else puts("IDENTITY LOST"); } return 0; }