二分长度,枚举字串,KMP判断。

View Code
 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 }