阿里“天池”竞赛平台近日推出了一个新的挑战任务:对于给定的一串 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; }