SCU 4493 DNA

Time Limit: 1000 MS    Memory Limit: 131072 K


Description

Deoxyribonucleic acid (DNA) is a molecule that carries most of the genetic instructions used in the development,
functioning and reproduction of all known living organisms and many viruses.
Most DNA molecules consist of two biopolymer strands coiled around each other to form a double helix.
The two DNA strands are known as polynucleotides since they are composed of simpler units called nucleotides.
Each nucleotide is composed of a nitrogen-containing nucleobase—either cytosine (C), guanine (G), adenine (A), or thymine (T)—
as well as a monosaccharide sugar called deoxyribose and a phosphate group. According to base pairing rules (A with T, and C with G),
hydrogen bonds bind the nitrogenous bases of the two separate polynucleotide strands to make double-stranded DNA.
We define the length of a strand as the number of its nucleobases. Given a bunch of different DNA strands, for each strand,
find the length of the longest common pieces between the two complementary strands.

Input

The first line is the number of test cases, T, where 0 < T<=100.
Each line followed represents a DNA strand, whose length is no more than 5000.

Output

For each strand, print a number, indicating the answer illustrated above.

Sample Input

3
A
AT
ATAT

Sample Output

0
1
3

Author

mrxy_56

分析:题目中给了一个字符串 , 根据要求 再构造一个字符串

即找两个的公共字串的数目

需要用到后缀数组

代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
typedef long long ll;
using namespace std;
const int MAXN=200010;
int wa[MAXN],wb[MAXN],wv[MAXN],Ws[MAXN];
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}
void da(const char r[],int sa[],int n,int m)
{
      int i,j,p,*x=wa,*y=wb,*t;
      for(i=0; i<m; i++) Ws[i]=0;
      for(i=0; i<n; i++) Ws[x[i]=r[i]]++;
      for(i=1; i<m; i++) Ws[i]+=Ws[i-1];
      for(i=n-1; i>=0; i--) sa[--Ws[x[i]]]=i;
      for(j=1,p=1; p<n; j*=2,m=p)
      {
            for(p=0,i=n-j; i<n; i++) y[p++]=i;
            for(i=0; i<n; i++) if(sa[i]>=j) y[p++]=sa[i]-j;
            for(i=0; i<n; i++) wv[i]=x[y[i]];
            for(i=0; i<m; i++) Ws[i]=0;
            for(i=0; i<n; i++) Ws[wv[i]]++;
            for(i=1; i<m; i++) Ws[i]+=Ws[i-1];
            for(i=n-1; i>=0; i--) sa[--Ws[wv[i]]]=y[i];
            for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1; i<n; i++)
                  x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
      }
      return;
}
int sa[MAXN],Rank[MAXN],height[MAXN];

void calheight(const char *r,int *sa,int n)
{
      int i,j,k=0;
      for(i=1; i<=n; i++) Rank[sa[i]]=i;
      for(i=0; i<n; height[Rank[i++]]=k)
            for(k?k--:0,j=sa[Rank[i]-1]; r[i+k]==r[j+k]; k++);
      for(int i=n;i>=1;--i) ++sa[i],Rank[i]=Rank[i-1];
}
int main()
{
    char r1[MAXN];
    char r2[MAXN];
    int t;
    cin>>t;
     while(t--)
     {

      scanf("%s",r1);

        int L1=strlen(r1);
        for(int i=0;i<L1;i++)
        {
            if(r1[i]==‘A‘)
            r2[i]=‘T‘;
            else if(r1[i]==‘T‘)
            r2[i]=‘A‘;
            else if(r1[i]==‘G‘)
            r2[i]=‘C‘;
            else if(r1[i]==‘C‘)
            r2[i]=‘G‘;
        }
        int L2=L1;

        r1[L1]=126;
        int h=L1+1;
        for(int i=0;i<L2;i++)
        {
           r1[h++]=r2[i];
        }
        r1[h]=‘\0‘;
        int m=127;
        int len=h;
        da(r1,sa,h+1,m);

        calheight(r1,sa,h);

        int ans=0;

        for(int i=2;i<=len;i++)
        {
            if(height[i]>ans)
            {
                if(0<=sa[i-1]&&sa[i-1]<=L1&&L1<sa[i])
                ans=height[i];
                if(0<=sa[i]&&sa[i]<=L1&&L1<sa[i-1])
                ans=height[i];
            }         

        }
        cout<<ans<<endl;
}
}
时间: 2024-09-30 00:51:01

SCU 4493 DNA的相关文章

[SCU 4501] DNA序列 (状压DP)

SCU - 4501 给定若干个DNA序列,求最短包含所有序列的长度 包含不一定是连续包含,可以不是子串 状压DP 依次构造每一位 把每个字符串走到的位置标记一下,压成6进制数 然后每个状态拓展一个字符串 然后同时拓展其他所有下一位与其相同的串 然后把状态丢到队列里转移,当每个串都走到结尾时输出答案 可以保证答案最多不超过40 时间复杂度 O(ans?lenN) #pragma comment(linker, "/STACK:102400000,102400000") #include

UVA - 1368 DNA Consensus String

DNA Consensus String Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description  Figure 1. DNA (Deoxyribonucleic Acid) is the molecule which contains the genetic instructions. It consists of four different nuc

[LeetCode]Repeated DNA Sequences

题目:Repeated DNA Sequences 给定包含A.C.G.T四个字符的字符串找出其中十个字符的重复子串. 思路: 首先,string中只有ACGT四个字符,因此可以将string看成是1,3,7,20这三个数字的组合串: 并且可以发现{ACGT}%5={1,3,2,0};于是可以用两个位就能表示上面的四个字符: 同时,一个子序列有10个字符,一共需要20bit,即int型数据类型就能表示一个子序列: 这样可以使用计数排序的思想来统计重复子序列: 这个思路时间复杂度只有O(n),但是

POJ2778 DNA Sequence Trie+矩阵乘法

题意:给定N个有A C G T组成的字符串,求长度为L的仅由A C G T组成的字符串中有多少个是不含给定的N个字符串的题解: 首先我们把所有的模式串(给定的DNA序列)建Trie,假定我们有一个匹配串,并且在匹配过程到S[i]这个字符时匹配到了Trie上的某个节点t,那么有两种可能: 匹配失败:t->child[S[i]]为空,跳转到t->fail,因此t->fail一定不能是某个模式串的结尾: 匹配成功:跳转到t->child[S[i+1]],因此t->child[S[i

CodeForces 520C DNA Alignment

题意: 一段DNA序列(10^5长度)  定义h函数为两序列相同碱基个数  p函数为分别移动两个DNA序列后所有可能的h函数之和  问使p最大的序列有多少个 思路: 根据p函数的定义  我们发现p这个函数其实就是A序列每个碱基和B序列每个碱基比较再乘一个n 因此可以贪心构造B序列  即每次新加一个碱基必定是A序列中出现次数最多的碱基 那么最后的答案就是A序列中出现次数最多的碱基种类数的n次方 代码: #include<cstdio> #include<iostream> #incl

HDU - 1560 DNA sequence

给你最多8个长度不超过5的DNA系列,求一个包含所有系列的最短系列. 迭代加深的经典题.(虽然自己第一次写) 定一个长度搜下去,搜不出答案就加深大搜的限制,然后中间加一些玄学的减枝 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<

DNA Pairing

DNA 链缺少配对的碱基.依据每一个碱基,为其找到配对的碱基,然后将结果作为第二个数组返回. Base pairs(碱基对) 是一对 AT 和 CG,为给定的字母匹配缺失的碱基. 在每一个数组中将给定的字母作为第一个碱基返回. 例如,对于输入的 GCG,相应地返回 [["G", "C"], ["C","G"],["G", "C"]] 字母和与之配对的字母在一个数组内,然后所有数组再被组织

如何使用3D MAX建造出DNA双螺旋结构

首先,在基本上掌握了DNA双螺旋结构以及3DMAX的简单的使用方法之后,我们便可以建造DNA双螺旋结构了. 在 3DMAX中利用基本标准形状来建造单个碱基配对的情况,即利用基本形状中的球体和圆柱体来构造两颗求和圆柱连接在一起,调整好自己想要的形状即可.之后,先调整一下轴,也就是选中索要调整轴心的对象,然后点击层次那个按钮,之后点击仅影响轴,在对象上可以移动到自己想要的轴心的位置.(提示,如果想要精确的移动轴心的话,可以打开捕捉,然后点击右键,点击轴心,就可以轻松地捕捉轴心的位置了).然后选中所要

HBV DNA level _data analysis

HBV 表明抗原阳性是HCC最重要风险因子 Seropositivity for the hepatitis B surface antigen (HBsAg) is one of the most important risk factors for hepatocellular carcinoma hbv e 抗原阳性会增加HCC风险 In our previous study, seropositivity for the hepatitis B e antigen (HBeAg) was