• 阿里天池的新任务(简单)(KMP统计子串出现的次数)


    阿里“天池”竞赛平台近日推出了一个新的挑战任务:对于给定的一串 DNA 碱基序列 tt,判断它在另一个根据规则生成的 DNA 碱基序列 ss 中出现了多少次。

    输出格式

    输出一个整数,为 tt 在 ss 中出现的次数。

    样例说明

    对于第一组样例,生成的 ss 为TTTCGGAAAGGCC

    样例输入1

    13 2 5 4 9
    AGG

    样例输出1

    1

    样例输入2

    103 51 0 40 60
    ACTG

    样例输出2

    5
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    char s[2000005];
    int w1,w2;
    char t[1000005];
    int nextt[1000000];
    
    void getnext(int lent)
    {
        int i=0,j=-1;
        nextt[i]=-1;
        while(i<lent) {
            if(j==-1||t[i]==t[j]) {
                nextt[++i]=++j;
            }
            else j=nextt[j];
        }
    }
    
    int kmp(int pos,int lent,int lens)
    {
        int i=pos,j=0,ans=0;
        while(i<lens) {
            if(s[i]==t[j]||j==-1) ++i,++j;
            else j=nextt[j];
            if(j==lent) {
                ans++;
                j=nextt[j-1];
                i--;
            }
        }
        return ans;
    }
    
    
    int main()
    {
        int n,a,b,l,r;
        scanf("%d %d %d %d %d",&n,&a,&b,&l,&r);
        //scanf("%s",t);
        cin>>t;
        w1=b;
        int cous=0;
        if(b>=l&&b<=r&&b%2==0){
                s[cous++]='A';
            }else if(b>=l&&b<=r&&b%2==1){
                s[cous++]='T';
            }else if(b<l&&b%2==0||b>r&&b%2==0){
                s[cous++]='G';
            }else if(b<l&&b%2==1||b>r&&b%2==1){
                s[cous++]='C';
            }
        for(int i=1;i<n;i++){
            w2=w1+a;
            w2%=n;
            if(w2>=l&&w2<=r&&w2%2==0){
                s[cous++]='A';
            }else if(w2>=l&&w2<=r&&w2%2==1){
                s[cous++]='T';
            }else if(w2<l&&w2%2==0||w2>r&&w2%2==0){
                s[cous++]='G';
            }else if(w2<l&&w2%2==1||w2>r&&w2%2==1){
                s[cous++]='C';
            }
            w1=w2;
        }
        int ans=0;
        int lens=strlen(s);
        int lent=strlen(t);
        getnext(lent);
        ans=kmp(0,lent,lens);
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    获取html
    asp.net上传图片自动生成缩略图功能代码
    又发现了一个好东西zTree,KindEditor,Kissy Editor,脚本安全类工具Burp suite
    C#.Net网络程序开发Socket篇
    简单验证码的制作
    C#:文件创建、复制、移动、删除
    日常提醒2 (delphi源码)
    time_t和SYSTEMTIME 与TDateTime的转换 (转)
    简单的图片对比函数
    胃总是涨 大便不成形 打嗝 口有异味?
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/6883294.html
Copyright © 2020-2023  润新知