ARC104 B - DNA Sequence(思维+前缀和)

题意:

在这里插入图片描述

解法:

显然满足条件得子串必须A和T的数量相同,C和G的数量相同.

把A看作1,T看作-1,CG看作0,那么满足条件的子串一定和为0.
把C看作1,G看作-1,AT看走0,那么满足条件的子串一定和为0.

预处理出AT看作1-1的前缀和数组sum1[],
预处理出CG看作1-1的前缀额和数组sum2[],
O(n^2)枚举区间,如果区间的种个区间和都是0,那么满足条件.

code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=1e6+5;
char s[maxm];
int sum1[maxm];
int sum2[maxm];
int n;
void solve(){
    
    
    cin>>n>>(s+1);
    for(int i=1;i<=n;i++){
    
    
        if(s[i]=='A'){
    
    
            sum1[i]=1;
        }else if(s[i]=='T'){
    
    
            sum1[i]=-1;
        }else if(s[i]=='C'){
    
    
            sum2[i]=1;
        }else if(s[i]=='G'){
    
    
            sum2[i]=-1;
        }
    }
    for(int i=1;i<=n;i++){
    
    
        sum1[i]+=sum1[i-1];
        sum2[i]+=sum2[i-1];
    }
    int ans=0;
    for(int i=1;i<=n;i++){
    
    
        for(int j=i;j<=n;j++){
    
    
            if(sum1[j]-sum1[i-1]==0&&sum2[j]-sum2[i-1]==0){
    
    
                ans++;
            }
        }
    }
    cout<<ans<<endl;
}
signed main(){
    
    
    ios::sync_with_stdio(0);
    solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/115268586
DNA
今日推荐