Description
Input
Output
Sample Input
3
2
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
3
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA
GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA
GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA
3
CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
Sample Output
no significant commonalities
AGATAC
CATCATCAT
题意:给你m组DNA 要求你找到 最长公共的子串
思路:以第一个字符串为准 枚举 起点为 j 长度为 i 的子串 然后对其他字符串进行匹配(这个算法也是比较慢了)
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> #define ll long long int using namespace std; inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;} int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1}; int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1}; const int inf=0x3f3f3f3f; const ll mod=1e9+7; string s[10]; int dp[107]; void getnext(string t){ dp[1]=0; for(int i=2,j=0;i<=t.length();i++){ while(j>0&&t[i-1]!=t[j]) j=dp[j]; if(t[i-1]==t[j]) j++; dp[i]=j; } } bool kmp(string t,string p){ int len1=p.length(); int len2=t.length(); for(int i=1,j=0;i<=len1;i++){ while(j>0&&p[i-1]!=t[j]) j=dp[j]; if(p[i-1]==t[j]) j++; //cout<<j<<endl; if(j==len2) return true; } return false; } int main(){ ios::sync_with_stdio(false); int n; cin>>n; while(n--){ int m; cin>>m; for(int i=0;i<m;i++) cin>>s[i]; int len=s[0].length(); string ans=""; for(int i=1;i<=len;i++){ for(int j=0;j<=len-i;j++){ string temp=s[0].substr(j,i); getnext(temp); bool jug=1; for(int k=1;k<m;k++) jug&=kmp(temp,s[k]); //一假必假 if(jug){ if(ans.size()<temp.size()) ans=temp; else if(ans.size()==temp.size()) ans=min(ans,temp); } } //cout<<ans<<endl; } if(ans.size()<3) cout<<"no significant commonalities"<<endl; else cout<<ans<<endl; } return 0; }
poj 3080 Blue Jeans (暴力枚举子串+kmp)
原文:https://www.cnblogs.com/wmj6/p/10500345.html