标签:strong inpu 题意 tmp 最长公共子序列 ace ted http bee
链接:http://poj.org/problem?id=3080
题目:
Description
Input
Output
Sample Input
3
2
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
3
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA
GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA
GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA
3
CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
Sample Output
no significant commonalities AGATAC CATCATCAT
题意:
给出几个长度为60的字符串 求他们的最长公共子序列
思路:
因为长度很短 可以用暴力来做
把第一个字符串当作T串 拆分出所有的子串 然后和下面所有的字符串进行匹配
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int maxn=70;
int t,n,nx[maxn];
string s[maxn];
void getnx(string tmp,int len){
int j=0,k=-1;
nx[0]=-1;
while(j<len){
if(k==-1 || tmp[j]==tmp[k]) nx[++j]=++k;
k=nx[k];
}
}
int KMP_Index(string S,string T){
int i=0,j=0;
int slen=S.size(),tlen=T.size();
while(i<slen && j<tlen){
if(j==-1 || S[i]==T[j]) i++,j++;
else j=nx[j];
}
if(j==tlen) return 1;
else return 0;
}
int main(){
// freopen("1.in","r",stdin);
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++) cin>>s[i];
string ans=" ";
for(int i=1;i<=s[1].size();i++){
for(int j=0;j<=s[1].size()-i;j++){
memset(nx,0,sizeof(nx));
string tmp=s[1].substr(j,i);
getnx(tmp,tmp.size());
int flag=0;
for(int k=2;k<=n;k++){
if(KMP_Index(s[k],tmp)==0) flag=1;
}
if(flag==0){
if(ans.size()<tmp.size()) ans=tmp;
else if(ans.size()==tmp.size()) ans=min(ans,tmp);
}
}
}
if(ans.size()<3) printf("no significant commonalities\n");
else cout<<ans<<endl;
}
return 0;
}
标签:strong inpu 题意 tmp 最长公共子序列 ace ted http bee
原文地址:https://www.cnblogs.com/whdsunny/p/10853252.html