标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 14113 | Accepted: 6260 |
Description
Input
Output
Sample Input
3 2 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 3 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA 3 CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
Sample Output
no significant commonalities AGATAC CATCATCAT
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; char test[15][100]; int next[1000]; int len1; char head[100]; int n; int ma; char result[100]; void getnext(){ memset(next,0,sizeof(next)); int i=0,j=-1; next[0]=-1; while(i<len1){ if(j==-1||head[i]==head[j]){ i++; j++; next[i]=j; } else j=next[j]; } } int kmp(){ ma=100; for(int ti=1;ti<n;ti++){ int i=0,j=0,m=0; while(i<60){ if(j==-1||test[ti][i]==head[j]){ i++; j++; } else j=next[j]; if(j>m) m=j; } if(m<ma) ma=m; } return ma; } int main(){ int T; scanf("%d",&T); while(T--){ memset(test,0,sizeof(test)); memset(result,0,sizeof(result)); scanf("%d",&n); getchar(); for(int i=0;i<n;i++){ cin>>test[i]; } int ans=0; for(int i=0;i<=57;i++){ memset(head,0,sizeof(head)); len1=60-i; strcpy(head,test[0]+i); /// 枚举第一个串的所有后缀串(当然最后2个可以省去) head[len1]=‘\0‘; getnext(); int temp=kmp(); /// KMP求出这个后缀串与其余所有串的最大匹配。 if(temp>ans){ ans=temp; strncpy(result,test[0]+i,ans); } else if(temp==ans){ /// 存在多个最长公共子串,输出字典序最小的,WA了一次。 if(strcmp(test[0]+i,result)<0) strncpy(result,test[0]+i,ans); /// 复习: strncpy()没有复制最后的‘\0‘。 } } if(ans<3) printf("no significant commonalities\n"); else printf("%s\n",result); } return 0; }
poj 3080 kmp求解多个字符串的最长公共字串,(数据小,有点小暴力 16ms)
标签:
原文地址:http://www.cnblogs.com/13224ACMer/p/4698577.html