题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2328
多串找最长公共字串。
KMP:951ms
1 #include<cstdio> 2 #include<cstring> 3 const int maxn=4010; 4 const int maxm=210; 5 char s[maxn][maxm]; 6 char ans[maxm],temp[maxm]; 7 int n; 8 9 int nex[maxm]; 10 void getnex(char* p) 11 { 12 int pl=strlen(p); 13 int i=0,j=-1; 14 nex[0]=-1; 15 while(i<pl) 16 { 17 if(j==-1||p[i]==p[j]) 18 nex[++i]=++j; 19 else j=nex[j]; 20 } 21 } 22 bool fd(char*t,char *p) 23 { 24 int tl=strlen(t); 25 int pl=strlen(p); 26 int i=0,j=0; 27 while(i<tl&&j<pl) 28 { 29 while(j>0&&t[i]!=p[j]) 30 j=nex[j]; 31 if(t[i]==p[j]) 32 { 33 j++; 34 i++; 35 } 36 else i++; 37 if(j==pl) return true; 38 } 39 return false; 40 } 41 42 int main() 43 { 44 45 while(scanf("%d",&n)&&n) 46 { 47 int id=0,len=210,tlen; 48 for(int i=0;i<n;i++) 49 { 50 51 scanf("%s",s[i]); 52 tlen=strlen(s[i]); 53 if(len>tlen) {id=i;len=tlen;} 54 } 55 int m=0; 56 //枚举子串!!! 57 for(int i=0;i<len;i++) 58 for(int h=i;h<len;h++) 59 { 60 int is=0,vis=1; 61 for(int j=i;j<=h;j++) 62 { 63 temp[is++]=s[id][j]; 64 } 65 temp[is]='