B - DNA Sequence(思维)

Posted CCSU_Cola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B - DNA Sequence(思维)相关的知识,希望对你有一定的参考价值。

题目链接
题意:给你一个串,A和T匹配,G和C匹配,问有多少个子串可以通过重排列和原来的子串匹配。
思路:只需子串里的A的数量等于T的数量,C的数量等于G的数量,那么串通过重新排列就可以和原来的串匹配。如何判断某个区间的A和T数量是否相等,可以将A的值定为1,T的值定为-1。当某个前缀和为0的时候说明数量相等,且当某个前缀减去另一个前缀的值为0的时候,该段区间内的数量也相等。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int sum1[5010],sum2[5010];
int main(){
    int n;
    string str;
    cin>>n;
    cin>>str;
    for(int i=0;i<str.size();i++){
        sum1[i]=sum1[i-1];
        sum2[i]=sum2[i-1];
        if(str[i]=='A'){
            sum1[i]++;
        }
        else if(str[i]=='T'){
            sum1[i]--;
        }
        else if(str[i]=='G'){
            sum2[i]--;
        }
        else sum2[i]++;
    }
    ll ans=0;
    for(int i=0;i<str.size();i++){
        if(sum1[i]==0&&sum2[i]==0){//直接为0
                ans++;
            }
        for(int j=i+1;j<str.size();j++){
            if(sum1[j]-sum1[i]==0&&sum2[j]-sum2[i]==0){//相减为0
                ans++;
            }
        }
    }
    printf("%lld\\n",ans);
    return 0;
}

以上是关于B - DNA Sequence(思维)的主要内容,如果未能解决你的问题,请参考以下文章

POJ1699 Best Sequence(AC自动机+状压DP)

POJ 2778 DNA Sequence ( Trie图矩阵快速幂 )

习题:DNA Sequence(AC自动机)

POJ 2778 DNA Sequence(AC自动机+矩阵)

POJ2778 DNA Sequence(AC自动机+矩阵快速幂)

HDU 1560 DNA sequence(DNA序列)