二分长度,枚举字串,KMP判断。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 char s[4005][205]; 6 char ans[205]; 7 int next[205],n; 8 void getnext(char sr[]) 9 { 10 int i,j; 11 i=0;j=-1;next[0]=-1; 12 for(;sr[i]!='\0';) 13 { 14 if(j==-1||sr[i]==sr[j]) 15 { 16 next[++i]=++j; 17 } 18 else 19 { 20 j=next[j]; 21 } 22 } 23 } 24 bool kmp(char dr[],char sr[]) 25 { 26 int i,j; 27 for(i=j=0;dr[i]!='\0';) 28 { 29 if(j==-1||sr[j]==dr[i]) 30 { 31 i++;j++; 32 if(sr[j]=='\0') 33 return true; 34 } 35 else 36 { 37 j=next[j]; 38 } 39 } 40 return false; 41 } 42 bool solve(int len) 43 { 44 bool flag=false; 45 int mm=strlen(s[0]),i,j; 46 for(i=0,j;i+len<=mm;i++) 47 { 48 if(flag) 49 { 50 if(strncmp(ans,&s[0][i],len)>0) 51 { 52 char sr[205]; 53 memcpy(sr,&s[0][i],len*sizeof(char)); 54 sr[len]='\0'; 55 getnext(sr); 56 for(j=1;j<n;j++) 57 if(!kmp(s[j],sr)) 58 break; 59 if(j==n) 60 strcpy(ans,sr); 61 } 62 } 63 else 64 { 65 char sr[205]; 66 memcpy(sr,&s[0][i],len*sizeof(char)); 67 sr[len]='\0'; 68 getnext(sr); 69 for(j=1;j<n;j++) 70 if(!kmp(s[j],sr)) 71 break; 72 if(j==n) 73 strcpy(ans,sr),flag=true; 74 } 75 } 76 return flag; 77 } 78 int main() 79 { 80 while(scanf("%d",&n)&&n) 81 { 82 for(int i=0;i<n;i++) 83 scanf("%s",s[i]); 84 strcpy(ans,"IDENTITY LOST"); 85 int ll=1,rr=205,mid; 86 while(ll<=rr) 87 { 88 mid=(ll+rr)>>1; 89 if(solve(mid)) 90 ll=mid+1; 91 else 92 rr=mid-1; 93 } 94 printf("%s\n",ans); 95 } 96 return 0; 97 }