POJ 3080 Blue Jeans(KMP 最长公共子串)
来源:互联网 发布:传智播客 大数据 收费 编辑:程序博客网 时间:2024/05/24 01:41
Blue Jeans
Description
The Genographic Project is a research partnership between IBM and The National Geographic Society that is analyzing DNA from hundreds of thousands of contributors to map how the Earth was populated.
As an IBM researcher, you have been tasked with writing a program that will find commonalities amongst given snippets of DNA that can be correlated with individual survey information to identify new genetic markers.
A DNA base sequence is noted by listing the nitrogen bases in the order in which they are found in the molecule. There are four bases: adenine (A), thymine (T), guanine (G), and cytosine (C). A 6-base DNA sequence could be represented as TAGACC.
Given a set of DNA base sequences, determine the longest series of bases that occurs in all of the sequences.
As an IBM researcher, you have been tasked with writing a program that will find commonalities amongst given snippets of DNA that can be correlated with individual survey information to identify new genetic markers.
A DNA base sequence is noted by listing the nitrogen bases in the order in which they are found in the molecule. There are four bases: adenine (A), thymine (T), guanine (G), and cytosine (C). A 6-base DNA sequence could be represented as TAGACC.
Given a set of DNA base sequences, determine the longest series of bases that occurs in all of the sequences.
Input
Input to this problem will begin with a line containing a single integer n indicating the number of datasets. Each dataset consists of the following components:
- A single positive integer m (2 <= m <= 10) indicating the number of base sequences in this dataset.
- m lines each containing a single base sequence consisting of 60 bases.
Output
For each dataset in the input, output the longest base subsequence common to all of the given base sequences. If the longest common subsequence is less than three bases in length, display the string "no significant commonalities" instead. If multiple subsequences of the same longest length exist, output only the subsequence that comes first in alphabetical order.
Sample Input
32GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATAGATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAAGATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA3CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
Sample Output
no significant commonalitiesAGATACCATCATCAT
题意 给你n个DNA串 求它们的长度最大的公共子串 如果有多个 输出字典序最小的 长度小于3的不算
每个DNA串的长度都是60 可以从子串长度为60依次递减 并枚举所有该长度子串 当某个长度的子串也为其它n-1个串的子串时 就是我们要的答案了
判断是否为其它DNA串的子串直接kmp就行了
#include<cstdio>#include<cstring>using namespace std;const int N = 15, M = 65, L = 60;bool kmp (char s[], char p[]){ int next[M]; next[0] = -1, next[1] = 0; int plen = strlen (p), i = 0, j,slen = strlen (s); while (++i < plen - 1) { j = next[i]; while (j != -1 && p[i] != p[j]) j = next[j]; next[i + 1] = j + 1; } i = j = 0; while (i < slen && j < plen) { if (j == -1 || s[i] == p[j]) ++i, ++j; else j = next[j]; } return j == plen;}int main(){ int cas, n, flag; char s[N][M], tans[M],ans[M]; scanf ("%d", &cas); while (cas--) { scanf ("%d", &n); for (int i = flag = 0; i < n; ++i) scanf ("%s", s[i]); for (int lans = L; lans > 2 && flag == 0; --lans) { strcpy(ans,"ZZ"); for (int i = 0, j, k; i + lans <= L; ++i) { for (j = 0; j < lans; ++j) tans[j] = s[0][i + j]; tans[j] = '\0'; for (k = 1; k < n; ++k) if (!kmp (s[k], tans)) break; if (k == n) { if(strcmp(ans,tans)>0) strcpy(ans,tans); flag = 1; } } } if (flag == 1) printf ("%s\n", ans); else printf ("no significant commonalities\n"); } return 0;}
1 0
- poj 3080 Blue Jeans (KMP+最长公共子串)
- POJ 3080 Blue Jeans(KMP 最长公共子串)
- POJ 3080 Blue Jeans(KMP 最长公共子串)
- POJ 3080 Blue Jeans(KMP:最长连续公共子序列)
- poj 3080 Blue Jeans【KMP】【求公共子串】
- poj 3080 Blue Jeans(最长公共子串)
- POJ3080 Blue Jeans(KMP,求最长公共子串)
- POJ3080 Blue Jeans 最长公共子串
- POJ 3080/ ZOJ 2784 : Blue Jeans - 串匹配,最长公共子串
- poj 3080 Blue Jeans (多串最长公共子串 暴力)
- POJ 3080:Blue Jeans:枚举求解n个字符串的最长公共连续子串
- poj 3080 Blue Jeans(KMP匹配,枚举子串)
- POJ 3080 Blue Jeans【多串最长子串】
- Poj 3080 Blue Jeans + Hdu 2328 Corporate Identity (后缀数组 字典序最小的最长公共子串)
- poj3080(Blue Jeans)kmp求多个串公共子串
- POJ 3080 Blue Jeans (求最长公共字符串)
- POJ 3080 Blue Jeans KMP
- POJ 3080 Blue Jeans----kmp
- 如一日同一天如果被
- CF 456B(Fedya and Maths-找循环节)
- 师傅圣达菲搜狗非规范化过分的话
- 和科技苦于
- 索引- 基础题目选解
- POJ 3080 Blue Jeans(KMP 最长公共子串)
- 【项目开发】Discuz 把帖子修改成文章
- php将标准字符串格式时间转换成unix时间戳_strtotime
- 敌兵布阵(线段树)
- 类目延展代理协议
- C语言函数大全 chm含示例
- git - 简明指南
- 【项目开发】Dsicuz 用户名片属性下面的格式错乱解决
- 045:多对多单向关联