http://poj.org/problem?id=3080 题目就是让找一个公共的最长子串(连续的)
一看就想起了用KMP算法,但是本来就不太懂,更别说用了,还是搜了一下解题报告,套用了KMP的模板
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 using namespace std;
5 #define N 200
6 char str[20][N];
7
8
9 /*套用的KMP的模板,在模板串里求子串*/
10 int kmp(char s[],char t[])
11 {
12 int next[N];
13 int i,j,len1,len2;
14 for(i=0;i<N;i++)
15 next[i]=-1;
16 len1=strlen(s);
17 len2=strlen(t);
18 for(j=1;j<len2;j++)
19 {
20 for(i=next[j-1];i>=0&&t[i+1]!=t[j];i=next[i])
21 {
22 next[j]=((t[i+1]==t[j])?i+1:-1);
23 }
24 }
25 for(i=j=0;i<len1&&j<len2;i++)
26 if(s[i]==t[j])
27 j++;
28 else if(j)
29 j=next[j-1]+1,i--;
30 return j==len2? i-len2:-1;
31 }
32 /*到这里模板接受*/
33
34
35 int find(char *s,int m)
36 {
37 int i;
38 for(i=1;i<m;i++)
39 if(kmp(str[i],s)==-1) return 0;
40 return 1;
41 }
42 int main()
43 {
44 int i,j,k;
45 int t,m,max;
46 char s[N],temp[N],tt[N];
47 cin>>t;
48 while(t--)
49 {
50 max=-1;
51 cin>>m;
52 cin>>s;
53 for(i=1;i<m;i++)
54 cin>>str[i];
55 for(i=0;s[i]!='\0';i++)
56 {
57 for(j=i;s[j]!='\0';j++)
58 {
59 int cnt=0;
60 for(k=i;k<=j;k++)
61 temp[cnt++]=s[k];
62 temp[cnt]='\0';
63 if(find(temp,m))
64 {
65 if(j-i+1>max)
66 {
67 max=j-i+1;
68 strcpy(tt,temp);
69 }
70 else if(j-i+1==max)
71 {
72 if(strcmp(tt,temp)>0)
73 strcpy(tt,temp);
74 }
75 }
76 }
77 }
78 if(max<3) cout<<"no significant commonalities\n";
79 else cout<<tt<<endl;
80 }
81 return 0;
82 }