zoukankan      html  css  js  c++  java
  • Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组

    E. DNA Evolution
    time limit per test
    2 seconds
    memory limit per test
    512 megabytes
    input
    standard input
    output
    standard output

    Everyone knows that DNA strands consist of nucleotides. There are four types of nucleotides: "A", "T", "G", "C". A DNA strand is a sequence of nucleotides. Scientists decided to track evolution of a rare species, which DNA strand was string s initially.

    Evolution of the species is described as a sequence of changes in the DNA. Every change is a change of some nucleotide, for example, the following change can happen in DNA strand "AAGC": the second nucleotide can change to "T" so that the resulting DNA strand is "ATGC".

    Scientists know that some segments of the DNA strand can be affected by some unknown infections. They can represent an infection as a sequence of nucleotides. Scientists are interested if there are any changes caused by some infections. Thus they sometimes want to know the value of impact of some infection to some segment of the DNA. This value is computed as follows:

    • Let the infection be represented as a string e, and let scientists be interested in DNA strand segment starting from position l to position r, inclusive.
    • Prefix of the string eee... (i.e. the string that consists of infinitely many repeats of string e) is written under the string s from position lto position r, inclusive.
    • The value of impact is the number of positions where letter of string s coincided with the letter written under it.

    Being a developer, Innokenty is interested in bioinformatics also, so the scientists asked him for help. Innokenty is busy preparing VK Cup, so he decided to delegate the problem to the competitors. Help the scientists!

    Input

    The first line contains the string s (1 ≤ |s| ≤ 105) that describes the initial DNA strand. It consists only of capital English letters "A", "T", "G" and "C".

    The next line contains single integer q (1 ≤ q ≤ 105) — the number of events.

    After that, q lines follow, each describes one event. Each of the lines has one of two formats:

    • 1 x c, where x is an integer (1 ≤ x ≤ |s|), and c is a letter "A", "T", "G" or "C", which means that there is a change in the DNA: the nucleotide at position x is now c.
    • 2 l r e, where lr are integers (1 ≤ l ≤ r ≤ |s|), and e is a string of letters "A", "T", "G" and "C" (1 ≤ |e| ≤ 10), which means that scientists are interested in the value of impact of infection e to the segment of DNA strand from position l to position r, inclusive.
    Output

    For each scientists' query (second type query) print a single integer in a new line — the value of impact of the infection on the DNA.

    Examples
    input
    ATGCATGC
    4
    2 1 8 ATGC
    2 2 6 TTT
    1 4 T
    2 2 6 TA
    output
    8
    2
    4
    input
    GAGTTGTTAA
    6
    2 3 4 TATGGTG
    1 1 T
    1 6 G
    2 5 9 AGTAATA
    1 10 G
    2 2 6 TTGT
    output
    0
    3
    1
    Note

    Consider the first example. In the first query of second type all characters coincide, so the answer is 8. In the second query we compare string "TTTTT..." and the substring "TGCAT". There are two matches. In the third query, after the DNA change, we compare string "TATAT..."' with substring "TGTAT". There are 4 matches.

    题意:给你一个字符串只有ATCG四个字符

       q个操作,

       1操作,将x位置修改成字符c

       2操作,求区间[l,r]去匹配e,e一直循环,求所有匹配的数目;

    思路:数组数组,注意e的长度为[1,10];

       //表示 长度为i 以j为起点的循环节为i 字符为c的位置标记,详见代码;

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<stack>
    #include<cstring>
    #include<vector>
    #include<list>
    #include<set>
    #include<map>
    using namespace std;
    #define LL long long
    #define pi (4*atan(1.0))
    #define eps 1e-14
    #define bug(x)  cout<<"bug"<<x<<endl;
    const int N=1e5+10,M=2e6+10,inf=1e9+10;
    const LL INF=1e18+10,mod=1e9+7;
    
    struct AYT
    {
        int tree[N];
        int lowbit(int x)
        {
            return x&-x;
        }
        void update(int x,int c)
        {
            while(x<N)
            {
                tree[x]+=c;
                x+=lowbit(x);
            }
        }
        int query(int x)
        {
            int ans=0;
            while(x)
            {
                ans+=tree[x];
                x-=lowbit(x);
            }
            return ans;
        }
    };
    AYT tree[11][11][4];//表示 长度为i 以j为起点的循环节为i 字符为c的位置标记
    int gc(char a)
    {
        if(a=='A')return 0;
        if(a=='T')return 1;
        if(a=='C')return 2;
        return 3;
    }
    char a[N],ch[10]="ATCG";
    int main()
    {
        scanf("%s",a+1);
        int n=strlen(a+1);
        for(int i=1; i<=10; i++)
        {
            for(int j=1; j<=i; j++)
            {
                for(int k=0; k<4; k++)
                {
                    for(int l=j; l<=n; l+=i)
                        if(ch[k]==a[l])
                            tree[i][j][k].update(l,1);
                }
            }
        }
        int q;
        scanf("%d",&q);
        while(q--)
        {
            int t;
            scanf("%d",&t);
            if(t==1)
            {
                int x;
                char f[2];
                scanf("%d%s",&x,f);
                if(a[x]==f[0])continue;
                for(int i=1; i<=10; i++)
                {
                    for(int j=1; j<=i; j++)
                    {
                        if(x%i==j%i)
                        for(int k=0; k<4; k++)
                        {
                            if(a[x]==ch[k])
                                tree[i][j][k].update(x,-1);
                            if(f[0]==ch[k])
                                tree[i][j][k].update(x,1);
                        }
                    }
                }
                a[x]=f[0];
            }
            else
            {
                int l,r,ans=0;
                char f[12];
                scanf("%d%d%s",&l,&r,f+1);
                int len=strlen(f+1);
                for(int i=1; i<=len; i++)
                {
                    int x=gc(f[i]);
                    int s=(l+i-1)%len?(l+i-1)%len:len;
                    ans+=tree[len][s][x].query(r)-tree[len][s][x].query(l-1);
                }
                printf("%d
    ",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    页面嵌入QQ功能(点QQ建立一个临时会话,显示在页面的固定位置)
    mavn项目(springMVC) 引入静态资源(js、css)等
    java 信号量Semaphore
    无法访问windows安装服务。发生这种情况的可能是您在安全模式下运行windows,或是没有正确安装windows安装,。请与技术支持人员联系以获得帮助。
    IIS “另一个程序正在使用此文件,进程无法访问"
    无需写try/catch,也能正常处理异常
    不修改代码就能优化ASP.NET网站性能的一些方法
    Web性能优化:图片优化
    毕业论文参考文献规范格式
    分布式网格缓存Coherence简介
  • 原文地址:https://www.cnblogs.com/jhz033/p/7201025.html
Copyright © 2011-2022 走看看