Codeforces 827C - DNA Evolution

Posted Wisdom+.+

tags:

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

827C - DNA Evolution

思路:

写4*10*10个树状数组,一个维度是4(ATCG),另一个维度是长度len,另一个维度是pos%len,因为两个pos,如果len和pos%len相同,那么它们就在一个匹配里。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))

const int N=1e5+5;
int a[4][11][10][N];
int n;
int lowbit(int x)
{
    return x&(-x); 
} 
void update(int x,int pos,int c,int d)
{
    while(x<=n)
    {
        for(int i=1;i<=10;i++)
        a[c][i][pos%i][x]+=d;
        x+=lowbit(x);
    }
}
int sum(int x,int pos,int c,int len)
{
    int ans=0;
    while(x>0)
    {
        ans+=a[c][len][pos%len][x];
        x-=lowbit(x);
    }
    return ans;
}
int mp[200];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s,t;
    int m,a,l,r;
    mp[A]=0;
    mp[T]=1;
    mp[C]=2;
    mp[G]=3;
    cin>>s;
    n=s.size();
    for(int i=0;i<s.size();i++)
    {
        update(i+1,i+1,mp[s[i]],1);
    }
    cin>>m;
    while(m--)
    {
        cin>>a;
        //cout<<1<<endl;
        if(a==2)
        {
            cin>>l>>r>>t;
            int ans=0;
            for(int i=0;i<t.size();i++)
            ans+=sum(r,i+l,mp[t[i]],t.size())-sum(l-1,i+l,mp[t[i]],t.size());
            cout<<ans<<endl;
        }
        else
        {
            cin>>l;
            cin>>t;
            update(l,l,mp[s[l-1]],-1);
            update(l,l,mp[t[0]],1);
            s[l-1]=t[0];    
        }
    }
    return 0; 
} 

 

以上是关于Codeforces 827C - DNA Evolution的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E DNA Evolution

Codeforces 86C Genetic engineering(AC自动机+DP)

SLAM:使用EVO测评ORBSLAM2

SLAM的评测工具evo

完美实现使用evo评估VINS-Mono