poj - 3080-Blue Jeans
Blue Jeans
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 17434 | Accepted: 7728 |
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
16558378 | sunshinestyle | 3080 | Accepted | 700K | 16MS | G++ | 1245B | 2017-02-08 22:06:52 |
题解:
初级题目, 采用暴力即可。求出两两的最长连续子串,逐个匹配。
//p-3080 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int MAXN = 65; const int MAXM = 11; int dp[MAXN][MAXN]; char data[MAXM][MAXN], LCS[MAXN], comp[MAXN]; int function(int idx){ memset(dp, 0, sizeof(dp)); int max_len = 0, pt = -1; for(int i=1; i<=60; ++i){ for(int j=1; j<=strlen(comp+1); ++j){ if(data[idx][i] == comp[j]){ dp[i][j] = dp[i-1][j-1] + 1; if(dp[i][j] > max_len){ max_len = dp[i][j]; pt = j; } else if(dp[i][j] == max_len){ if(comp[j-max_len+1] < comp[pt-max_len+1]){ pt = j; } } } } } if(max_len >= 3){ for(int i=1; i<=max_len; ++i){ LCS[i] = comp[pt-max_len+i]; } LCS[max_len+1] = ‘\0‘; } return max_len; } int main(){ freopen("in.txt", "r", stdin); int test_num, m; scanf("%d", &test_num); while(test_num--){ scanf("%d", &m); scanf("%s", comp+1); for(int i=0; i<m-1; ++i){ scanf("%s", data[i]+1); } int idx = 0, flag = 1; while(idx<(m-1)){ if(function(idx) < 3){ flag = 0; break; } strcpy(comp+1, LCS+1); idx++; } if(flag == 0 || strlen(LCS+1) < 3){ printf("no significant commonalities\n"); }else{ printf("%s\n", LCS+1 ); } } return 0; }
原文:http://www.cnblogs.com/zhang-yd/p/6380085.html