2017 计蒜客初赛 阿里天池的新任务(KMP算法)
来源:互联网 发布:js foreach 编辑:程序博客网 时间:2024/05/16 14:56
阿里“天池”竞赛平台近日推出了一个新的挑战任务:对于给定的一串 DNA 碱基序列 t,判断它在另一个根据规则生成的 DNA 碱基序列 s 中出现了多少次。
首先,定义一个序列 w:
wi={b,(wi−1+a)modn,i=0i>0
接下来,定义长度为 n 的 DNA 碱基序列 s(下标从 0 开始):
si=⎩⎪⎪⎪⎨⎪⎪⎪⎧A,T,G,C,(L≤wi≤R)∧(wi mod 2=0)(L≤wi≤R)∧(wi mod 2=1)((wi<L)∨(wi>R))∧(wi mod 2=0)((wi<L)∨(wi>R))∧(wi mod 2=1)
其中 ∧ 表示“且”关系,∨ 表示“或”关系,a mod b 表示 a 除以 b 的余数。
现给定另一个 DNA 碱基序列 t,以及生成 s 的参数 n,a,b,L,R,求 t 在 s 中出现了多少次。
输入格式
数据第一行为 5 个整数,分别代表 n,a,b,L,R。第二行为一个仅包含A
、T
、G
、C
的一个序列 t。
数据保证 0<a<n, 0≤b<n, 0≤L≤R<n, ∣t∣≤106,a,n 互质。
对于简单版本,1≤n≤106;
对于中等版本,1≤n≤109,a=1;
对于困难版本,1≤n≤109。
输出格式
输出一个整数,为 t 在 s 中出现的次数。
样例说明
对于第一组样例,生成的 s 为TTTCGGAAAGGCC
。
样例输入1
13 2 5 4 9AGG
样例输出1
1
样例输入2
103 51 0 40 60ACTG
样例输出2
5
思路:直接KMP即可;KMP算法链接点击打开链接
代码:
#include <bits/stdc++.h>using namespace std;char s[1000005];char t[1000005];int nexts[1000005];int lens,lent;void getnext() { nexts[0]=-1; int i=0,j=-1; while(i<lent) { if(j==-1||t[i]==t[j]) nexts[++i]=++j;else j=nexts[j]; }}void KMP() { int i=0,j=0,k=0; while(i<lens) { if(j==-1||s[i]==t[j]) ++i,++j;else j=nexts[j]; if(j==lent) k++,j=nexts[j]; } printf("%d\n",k);}int main(){int n,a,b,l,r;scanf("%d %d %d %d %d",&n,&a,&b,&l,&r);int w=b-a;scanf("%s",t);for(int i=0;i<n;i++){w=(w+a)%n;if(l<=w&&w<=r&&w%2==0){s[i]='A';}else if(l<=w&&w<=r&&w%2==1){s[i]='T';}else if((w<l||r<w)&&w%2==0){s[i]='G';}else if((w<l||r<w)&&w%2==1){s[i]='C';}}lens=strlen(s),lent=strlen(t); getnext(); KMP();return 0; }
阅读全文
1 0
- 2017 计蒜客初赛 阿里天池的新任务(KMP算法)
- 2017 计蒜之道 初赛 第一场 阿里天池的新任务(简单)(KMP)
- 阿里天池的新任务(简单)【字符串匹配哈希算法】 计蒜客初赛第一场
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)
- 2017计蒜客第一场B题-阿里天池的新任务(简单)(数据结构-KMP)
- 计蒜客2017第一场 B 阿里天池的新任务(简单) KMP
- 阿里天池的新任务(简单)KMP,看样子网上有bug的kmp算法还是有蛮多
- 2017 计蒜之道 初赛 第一场 B题(阿里天池的新任务)
- 2017计蒜之道 初赛第一场 阿里天池的新任务(简单)
- 计蒜客-阿里天池的新任务(kmp求字符串出现的次数)
- 计蒜客 阿里天池的新任务(简单)KMP轻松水过
- [数论] 2017 计蒜之道 初赛 第一场 阿里天池的新任务
- 计蒜之道初赛第一场-阿里天池的新任务(简单)
- 计蒜客 15500 阿里天池的新任务(简单) 题解
- 2017 计蒜之道 初赛 第一场 阿里的天池任务(简单)
- 天池阿里音乐流行趋势预测大赛--初赛
- 阿里天池比赛报告的一点总结
- 阿里天池搞MaxCompute的一些坑
- (OK) MIMP
- servlet实现原理
- ELK5.2+kafka+zookeeper+filebeat集群部署
- SpringMVC源码(十一)请求参数绑定和获取
- Mybatis用xml文件映射的增删查改
- 2017 计蒜客初赛 阿里天池的新任务(KMP算法)
- sublime 插件收集
- Linux系统发布java系统缓存过大启动Tomcat报错解决办法
- nodejs 学习
- Android从零开始20170712
- 移动游戏风格
- Hyperledger Fabric 1.0发布:基于区块链的开源分布式账本
- 关于Echarts渲染地图(不创建地图实例)如何修改基础配置的方法
- Android PJSUA2源码编译