dna

长度不超过一半的最长回文后缀还不太会求。。先mark

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 101000,A = 4,B = 5;

struct Node{
    int len,next[A],suf,fa;
    void clean(){
        memset(next,0,sizeof(next));
        suf = 0;len = 0;fa = 0;
    }
}nod[N];//1为长度为-1的root,2为长度为0的root 

char s[N];
map<int,int> q;
int T,n,maxsuf,len,base[N],f[N],g[N],ans,half[N],suf2[N];
void init();
int main(){
    scanf("%d",&T);
    base[0] = 1;for (int i = 1;i <= n;i++) base[i] = base[i-1]*B;
    while (T--){
        memset(suf2,0,sizeof(suf2));
        scanf("%s",s+1);n = strlen(s+1);
        for (int i = 1;i <= n;i++){
            if (s[i] == ‘G‘) s[i] = ‘B‘;
            if (s[i] == ‘T‘) s[i] = ‘D‘;
        }
        s[0] = ‘&‘;
        init();
        ans = n;

        for (int i = 3;i <= len;i++){
            int u = nod[i].suf;
            while (nod[u].len*2 > nod[i].len) u = nod[u].suf;
            if (u < 2) u = 2;
            suf2[i] = u;
        }

        g[2] = 1;g[1] = n;
        for (int i = 3;i <= len;i++){
            if (nod[i].len & 1) g[i] = nod[i].len;
            else{
                g[i] = min(g[nod[i].fa]+1,g[suf2[i]]+nod[i].len/2-nod[suf2[i]].len+1);
                if (q[half[i]] != 0) g[i] = min(g[i],q[half[i]]+1);
            }
        }
        for (int i = 3;i <= len;i++){
            ans = min(ans,g[i]+n-nod[i].len);
//            printf("%d %d %d %d %d\n",i,g[i],suf2[i],nod[i].len,nod[i].suf);
        }
        cout << ans << "\n";
        q.clear();
    }
    return 0;
}
void init(){
    len = 0;
    nod[++len].clean();
    nod[1].len = -1;nod[1].suf = 1;
    nod[++len].clean();
    nod[2].len = 0;nod[2].suf = 1;
    suf2[1] = suf2[2] = 1;
    maxsuf = 2;
    for (int i = 1;i <= n;i++){
        int next;
//        cout << i << endl;
        while (s[i-nod[maxsuf].len-1] != s[i]){
//            if (maxsuf != 0) cout << maxsuf << endl;
            maxsuf = nod[maxsuf].suf;
        }
//        cout << i << endl;
        Node &g = nod[maxsuf];
//        cout << maxsuf << endl;
        if (g.next[s[i]-‘A‘] == 0) {
            g.next[s[i]-‘A‘] = ++len;

            nod[len].clean();
            nod[len].fa = maxsuf;
            if (maxsuf == -1) f[len] = s[i]-‘A‘;
            else f[len] = f[len]*B+s[i]-‘A‘+(s[i]-‘A‘)*base[nod[maxsuf].len+1];
            if (nod[maxsuf].len%2 == 0) half[len] = half[maxsuf]*B+s[i]-‘A‘;
            nod[len].len = g.len+2;

            next = g.next[s[i]-‘A‘];
            maxsuf = nod[maxsuf].suf;
            while (s[i-nod[maxsuf].len-1] != s[i])
                maxsuf = nod[maxsuf].suf;
            nod[len].suf = nod[maxsuf].next[s[i]-‘A‘];
            if (nod[len].suf == len || nod[len].suf == 0) nod[len].suf = 2;        

            /*
            maxsuf = nod[len].suf;
            while (maxsuf > 1 && nod[maxsuf].len*2+4 > nod[len].len){
                maxsuf = nod[maxsuf].suf;
                while (s[i-nod[maxsuf].len-1] != s[i])
                    maxsuf = nod[maxsuf].suf;
            }
            if (maxsuf > 1) suf2[len] = nod[maxsuf].next[s[i]-‘A‘];
            else if (nod[len].len == 1) suf2[len] = 1;
            else suf2[len] = nod[1].next[s[i]-‘A‘];
            */
            maxsuf = next;
        }
        else maxsuf = g.next[s[i]-‘A‘];
//        if (maxsuf == 0) cout << "A\n";
    }
     /*check
        for (int i = 1;i <= len;i++){
            Node &g = nod[i];
            printf("%d %d\n",g.len,g.suf);
            for (int j = 0;j < 4;j++)
                printf("%d ",g.next[j]);
            printf("\n");
        }
     */
}
时间: 2024-10-23 04:52:08

dna的相关文章

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

Share data between VSTO and Excel DNA App domains

Is there a way to share data between a VSTO add in and an Excel DNA add in? Or can the Excel DNA add in be loaded into the VSTO's app domain? The Excel-DNA add-in will always be in a separate AppDomain. You might try to pass an object via the AddIn's

ThoughtWorks 2016年第1期DNA活动总结

今天受邀参加了2016年ThoughtWorks公司成都分公司的2016年第一期DNA活动. 什么是DNA? DNA 即 Design And Analysis.设计与分析.这个活动主要是针对产品经理的,我一个码农也去参加了,多多少少还是有一些收获. ThoughtWorks这家公司给我的印象是很不错的,没参加该活动之前也对这家公司有一定的了解,公司的氛围也是很不错的.美女很多哈,据说该公司招聘比较均衡,男女比例近乎1:1,对码农是多么幸福的事情. 好了,废话不多说了.先看看我画的一张图,第一次