程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> UVA 題目760 DNA Sequencing (後綴數組求兩個串最長公共子串,字典序輸出)

UVA 題目760 DNA Sequencing (後綴數組求兩個串最長公共子串,字典序輸出)

編輯:關於C++


 

DNA Sequencing

A DNA molecule consists of two strands that wrap around each other to resemble a twisted ladder whose sides, made of sugar and phosphate molecules, are connected by rungs of nitrogen-containing chemicals called bases. Each strand is a linear arrangement of repeating similar units called nucleotides, which are each composed of one sugar, one phosphate, and a nitrogenous base. Four different bases are present in DNA: adenine (A), thymine (T), cytosine (C), and guanine (G). The particular order of the bases arranged along the sugar-phosphate backbone is called the DNA sequence; the sequence specifies the exact genetic instructions required to create a particular organism with its own unique traits.

 


Geneticists often compare DNA strands and are interested in finding the longest common base sequence in the two strands. Note that these strands can be represented as strings consisting of the lettersa, t, c and g. So, the longest common sequence in the two strands atgc and tga is tg. It is entirely possible that two different common sequences exist that are the same length and are the longest possible common sequences. For example in the strands atgc and gctg, the longest common sequences aregc and tg.

 

Input and Output

Write a program that accepts as input two strings representing DNA strands, and prints as output the longest common sequence(s) in lexicographical order.

If there isn't any common sequence between the two strings, just print: ``No common sequence.

If there are more than one test cases, it must be a blank line between two consecutive, both in input and output files.

The strings are at most 300 characters-long.

 

Sample Input

 

atgc
tga

atgc
gctg

 

Sample Output

 

tg

gc
tg

0ms

ac代碼

 

#include   
#include   
#include   
#include  
#define min(a,b) (a>b?b:a) 
using namespace std;  
char str1[660],str2[660];
int sa[660],c[660],t2[660];
int t1[660],s[660];  
int rank[660],height[660]; 
int len1,len2; 
void build_sa(int s[],int n,int m)  
{  
    int i,j,p,*x=t1,*y=t2;  
    for(i=0;i=0;i--)  
        sa[--c[x[i]]]=i;  
    for(j=1;j<=n;j<<=1)  
    {  
        p=0;  
        for(i=n-j;i=j)  
                y[p++]=sa[i]-j;  
        for(i=0;i=0;i--)  
            sa[--c[x[y[i]]]]=y[i];  
        swap(x,y);  
        p=1;  
        x[sa[0]]=0;  
        for(i=1;i=n)  
            break;  
        m=p;  
    }  
}  
void getHeight(int s[],int n)  
{  
    int i,j,k=0;  
    for(i=0;i<=n;i++)  
        rank[sa[i]]=i;  
    for(i=0;i=k)
		{
			if(sa[i]>len1&&sa[i-1]<=len1)
				return 1;
			if(sa[i-1]>len1&&sa[i]<=len1)
				return 1;
		}
	}
	return 0;
}
int main()
{
	int flag=0;
	while(scanf(%s%s,str1,str2)!=EOF)
	{
		int i,j,k;
		if(flag)
			printf(
);
		flag=1;
		len1=strlen(str1);
		len2=strlen(str2);
		for(i=0;i>1;
			if(judge(n,mid))
			{
				ans=mid;
				l=mid+1;
			}
			else
				r=mid-1;
		}
		if(!ans)
		{
			printf(No common sequence.
);
			continue;
		}
	//	printf(%d %d
,n,len1+len2+2);
		for(i=1;i<=n;i++)
		{
			if(height[i]>=ans)
			{
				for(j=i;j<=n&&height[j]>=ans;j++)
					;
				for(k=i;klen1&&sa[k-1]len1&&sa[k]

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved