zoukankan      html  css  js  c++  java
  • 阿里天池的新任务(简单)(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;
    }
  • 相关阅读:
    C# List 查找重复项 Distinct()方法
    AE单词备忘
    UML建模—EA创建Use Case(用例图)
    UML之用例图
    是时候改变你的开发方式了-XAF信息系统快速框架介绍
    教你5分钟做个手机APP[视频]
    教你5分钟做个手机APP[视频]
    在.NET 框架中使用 C# 8 和可空引用类型
    C# 9 提案:模块初始化器
    How to: Filter a Report Parameter's Lookup 如何:筛选报表参数的查找
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/6883294.html
Copyright © 2011-2022 走看看