本文主要是介绍poj 3080 Blue Jeans(KMP+字典序输出),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、http://poj.org/problem?id=3080
2、题目大意:
给定多组样例,每组样例有n个长度为60的字符串,求这n个字符串中长度最长的公共子串,如果有多个这样的子串,按照字典序输出
3、用KMP算法解决
思路:
从第一个主串开始查找其中的每一个子串是不是在其他子串中可以找到,如果能找到,看长度大小,如果跟最大的相同,则找字典序小的那个,
4.题目:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9376 | Accepted: 3941 |
Description
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
- 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
Sample Input
3 2 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 3 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA 3 CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
Sample Output
no significant commonalities AGATAC CATCATCAT
Source
4、代码;
#include<stdio.h>
#include<string.h>
char str[12][65];
char s[65];
char ans[65];
int f[65];
//求子模板串的模式值f[n]的函数
//f[i]表示以i为下标的字符前边有几个跟开头重复的字符
void getFail(char *p, int *f)
{int m=strlen(p);f[0]=f[1]=0;for(int i=1; i<m; ++i){int j=f[i];while(j && p[i]!=p[j])j=f[j];f[i+1] = p[i]==p[j]?1+j:0;}
}
//查找是否匹配函数
bool find(char *T,char *p,int *f)//传入的三个参数分别是主字符串,要比较的子模板串,子模板串的模式值数组
{getFail(p,f);int n=strlen(T);int m=strlen(p);int j=0;for(int i=0; i<n; ++i)//循环主串中的字符{//如果出现字符不匹配,没必要从头循环,只需要从模式值f[j]查找while(j && T[i]!=p[j])j=f[j];if(T[i]==p[j])++j;if(j==m)//当j==m时,表示找到匹配的字符串{return true;}}return false;
}
int main()
{int t,n;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=0; i<n; i++){scanf("%s",str[i]);}int nmax=3;//循环主串bool first=false;for(int i=0; i<n; i++){for(int j=0; j<60-3; j++) //循环模板串的起始点{memset(s,0,sizeof(s));for(int p=0,k=j; k<60; k++){s[p++]=str[i][k];if(p>=nmax){bool flag=false;for(int l=0; l<n; l++){if(l!=i){if(!find(str[l],s,f))//不能找到该模板串{flag=true;}}}if(flag)//在其他主串中不能找到该模板串{break;//break出去以当前元素为起始点的,短的找不到,长的也找不到}else{if(p==nmax)//如果相同,字典序输出{if(first==false){strcpy(ans,s);first=true;}if(strcmp(ans,s)>0&&first==true)strcpy(ans,s);}else if(p>nmax){strcpy(ans,s);nmax=p;}}}}}}if(first==false)printf("no significant commonalities\n");elseprintf("%s\n",ans);}return 0;
}
这篇关于poj 3080 Blue Jeans(KMP+字典序输出)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!