阿里天池的新任务(简单)(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\n",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/TWS-YIFEI/p/6883294.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值