标签:mp算法 algorithm with clu problem splay sts geo oid
Description
Input
Output
Sample Input
3 2 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 3 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA 3 CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
Sample Output
no significant commonalities AGATAC CATCATCAT
Source
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<string> using namespace std; typedef long long LL; #define MAXN 63 /* 枚举所有子串,用KMP算法检查是否出现过,选择其中的最优解 */ char s[MAXN][MAXN]; int next[MAXN]; void kmp_pre(char x[]) { int i,j,m=strlen(x); j = next[0] = -1; i = 0; while(i<m) { if(j!=-1&&x[i]!=x[j]) j = next[j]; next[++i] = ++j; } } bool kmp(char x[],char y[]) { int i,j,ans = 0,m=strlen(x),n=strlen(y); kmp_pre(x); i=j=0; while(i<n) { while(j!=-1&&y[i]!=x[j]) j = next[j]; i++; j++; if(j>=m) return true; } return false; } int main() { int t; scanf("%d",&t); while(t--) { int m; char ans[MAXN] = "Z"; scanf("%d",&m); for(int i=0;i<m;i++) scanf("%s",s[i]); for(int len=60;len>=3;len--) for(int i=0;i<=60-len;i++) { char b[MAXN] = {0}; strncpy(b,s[0]+i,len); //cout<<len<<":"<<b<<endl; int j; for(j=1;j<m;j++) { if(!kmp(b,s[j])) break; } if(j==m&&strcmp(ans,b)>0) { strcpy(ans,b); } if(ans[0]!=‘Z‘&&i==60-len) { i = 999; len = 0; } } if(ans[0]==‘Z‘) printf("no significant commonalities\n"); else printf("%s\n",ans); } return 0; }
Blue Jeans POJ 3080 寻找多个串的最长相同子串
标签:mp算法 algorithm with clu problem splay sts geo oid
原文地址:http://www.cnblogs.com/joeylee97/p/6665955.html