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

首先,定义一个序列 ww:

\displaystyle w_{i} = \begin{cases}b, & i = 0\\(w_{i-1} + a) \mod n, & i > 0\end{cases}w​i​​={​b,​(w​i−1​​+a)modn,​​​i=0​i>0​​

接下来,定义长度为 nn 的 DNA 碱基序列 ss(下标从 00 开始):

\displaystyle s_{i} = \begin{cases}A , & (L \le w_{i} \le R) \land (w_{i}\ \mathrm{mod}\ 2 = 0)\\T , & (L \le w_{i} \le R) \land (w_{i}\ \mathrm{mod}\ 2 = 1)\\G , & ((w_{i} < L) \lor (w_{i} > R)) \land (w_{i}\ \mathrm{mod}\ 2 = 0)\\C , & ((w_{i} < L) \lor (w_{i} > R)) \land (w_{i}\ \mathrm{mod}\ 2 = 1)\end{cases}s​i​​=​⎩​⎪​⎪​⎪​⎨​⎪​⎪​⎪​⎧​​​A,​T,​G,​C,​​​(L≤w​i​​≤R)∧(w​i​​ mod 2=0)​(L≤w​i​​≤R)∧(w​i​​ mod 2=1)​((w​i​​<L)∨(w​i​​>R))∧(w​i​​ mod 2=0)​((w​i​​<L)∨(w​i​​>R))∧(w​i​​ mod 2=1)​​

其中 \land∧ 表示“且”关系,\lor∨ 表示“或”关系,a\ \mathrm{mod}\ ba mod b 表示 aa 除以 bb 的余数。

现给定另一个 DNA 碱基序列 tt,以及生成 ss 的参数 n , a , b , L , Rn,a,b,L,R,求 tt 在 ss 中出现了多少次。

输入格式

数据第一行为 55 个整数,分别代表 n , a , b , L , Rn,a,b,L,R。第二行为一个仅包含ATGC的一个序列 tt。

数据保证 0 < a < n,0<a<n, 0 \le b < n,0≤b<n, 0 \le L \le R < n,0≤L≤R<n, |t| \le 10^{6}∣t∣≤10​6​​,a,na,n 互质。

对于简单版本,1 \leq n \leq 10^{6}1≤n≤10​6​​;

对于中等版本,1 \leq n \leq 10^{9}, a = 11≤n≤10​9​​,a=1;

对于困难版本,1 \leq n \leq 10^{9}1≤n≤10​9​​。

输出格式

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

样例说明

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

样例输入1

  1. 13 2 5 4 9
  2. AGG

样例输出1

  1. 1

样例输入2

  1. 103 51 0 40 60
  2. ACTG

样例输出2

  1. 5
    构造序列,然后就是裸的KMP,第一场就出线,好幸运哈哈哈哈哈哈
  1. /*
  2. * @Author: lyucheng
  3. * @Date: 2017-05-20 18:55:59
  4. * @Last Modified by: lyucheng
  5. * @Last Modified time: 2017-05-20 20:43:25
  6. */
  7.  
  8. #include <bits/stdc++.h>
  9. #define LL long long
  10. using namespace std;
  11. LL res=;
  12. /*******************KMP模板***********************/
  13. void makeNext(const char P[],LL Next[])
  14. {
  15. /*
  16. Next[i]表示前i个字符中,最大前后缀相同的长度
  17. */
  18. LL q,k;
  19. LL m=strlen(P);
  20. Next[]=;
  21. for (q=,k=;q<m;++q)
  22. {
  23. while(k>&&P[q]!=P[k])
  24. k = Next[k-];
  25. /*
  26. 这里的while循环很不好理解!
  27. 就是用一个循环来求出前后缀最大公共长度;
  28. 首先比较P[q]和P[K]是否相等如果相等的话说明已经K的数值就是已匹配到的长的;
  29. 如果不相等的话,那么Next[k-1]与P[q]的长度,为什么呐?因为当前长度不合适
  30. 了,不能增长模板链,就缩小看看Next[k-1]
  31. 的长度能够不能和P[q]匹配,这么一直递归下去直到找到
  32. */
  33. if(P[q]==P[k])//如果当前位置也能匹配上,那么长度可以+1
  34. {
  35. k++;
  36. }
  37. Next[q]=k;
  38. }
  39. }
  40.  
  41. void kmp(const char T[],const char P[],LL Next[])
  42. {
  43. LL n,m;
  44. LL i,q;
  45. n = strlen(T);
  46. m = strlen(P);
  47. makeNext(P,Next);
  48. for (i=,q=;i<n;++i)
  49. {
  50. while(q>&&P[q]!= T[i])
  51. q = Next[q-];
  52. /*
  53. 这里的循环就是位移之后P的前几个字符能个T模板匹配
  54. */
  55. if(P[q]==T[i])
  56. {
  57. q++;
  58. }
  59. if(q==m)//如果能匹配的长度刚好是T的长度那么就是找到了一个能匹配成功的位置
  60. {
  61. res++;
  62. }
  63. }
  64. }
  65. /*******************KMP模板***********************/
  66. LL n,a,b,L,R;
  67. char t[];//用来匹配的子串
  68. char p[];
  69. LL Next[];
  70. LL last,now;
  71. LL len=;
  72. int main(){
  73. // freopen("in.txt","r",stdin);
  74. scanf("%lld%lld%lld%lld%lld",&n,&a,&b,&L,&R);
  75. scanf("%s",t);
  76. for(int i=;i<n;i++){
  77. if(i==){
  78. now=b;
  79. if(now>=L&&now<=R){
  80. if(now%==){
  81. p[len++]='A';
  82. }else{
  83. p[len++]='T';
  84. }
  85. }else{
  86. if(now%==){
  87. p[len++]='G';
  88. }else{
  89. p[len++]='C';
  90. }
  91. }
  92. }else{
  93. now=(last+a)%n;
  94. if(now>=L&&now<=R){
  95. if(now%==){
  96. p[len++]='A';
  97. }else{
  98. p[len++]='T';
  99. }
  100. }else{
  101. if(now%==){
  102. p[len++]='G';
  103. }else{
  104. p[len++]='C';
  105. }
  106. }
  107. }
  108. last=now;
  109. }
  110. makeNext(t,Next);
  111. kmp(p,t,Next);
  112. printf("%lld\n",res);
  113. return ;
  114. }

计蒜之道 初赛第一场B 阿里天池的新任务(简单)的更多相关文章

  1. 2017 计蒜之道 初赛 第一场 B阿里天池的新任务(简单)

    题链:"https://nanti.jisuanke.com/t/15500" 本来希望通过找循环节然后套KMP来通过后面题的,可是只过了B题,可能循环节不一定是存在的. #inc ...

  2. 2017 计蒜之道 初赛 第一场 A 阿里的新游戏

    题链:https://nanti.jisuanke.com/t/15499 这题观察图纸可知成三线段上的相邻点之间的距离有1,2,3三种情况的,同时要成线段必然是同横坐标或者纵坐标,然后我们排除掉穿过 ...

  3. 2017 计蒜之道 初赛 第一场 A、B题

    A题 阿里的新游戏 题目概述: 阿里九游开放平台近日上架了一款新的益智类游戏——成三棋.成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示: 成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋 ...

  4. 2018 计蒜之道-初赛 第一场 A-百度无人车

    百度一共制造了 nn 辆无人车,其中第 ii 辆车的重量为 a_i\ \mathrm{kg}ai​ kg. 由于车辆过重会增大轮胎的磨损程度,现在要给这 nn 辆车减轻重量.每将一辆车减轻 1\ \m ...

  5. 2016 计蒜之道 初赛 第一场 D 青云的机房组网方案 (虚树)

    大意: 给定树, 点$i$的点权为$a_i$, 求$\sum\limits_{a_i \perp a_j}dis(i,j)$ 中等难度可以枚举每条边的贡献, 维护子树内每个数出现次数$a$, 转化为求 ...

  6. 2019 计蒜之道 初赛 第一场 商汤的AI伴游小精灵

    https://nanti.jisuanke.com/t/39260 根据题意我们可以知道  这是一个树 我们只需要找到出度最大的两个点就好了 如果包含根节点的话要-- 两个点相邻的话也要-- 数据很 ...

  7. 2019 计蒜之道 初赛 第一场 商汤AI园区的n个路口(中等) (树形dp)

    北京市商汤科技开发有限公司建立了新的 AI 人工智能产业园,这个产业园区里有 nn 个路口,由 n - 1n−1 条道路连通.第 ii 条道路连接路口 u_iui​ 和 v_ivi​. 每个路口都布有 ...

  8. 2019 计蒜之道 初赛 第二场 B. 百度AI小课堂-上升子序列(简单) ( 实现)

    题目背景 ​91029102 年 99 月 22 日,百度在 X 市 XX 中学举办的第一场 AI 知识小课堂大获好评!同学们对矩阵的掌握非常棒. 今天的 AI 知识小课堂的第二场开讲啦.本场 AI ...

  9. 2019 计蒜之道 初赛 第二场 A 百度AI小课堂-矩阵问题 ( 等差数列求和公式)

    题目背景 ​91029102 年 99 月 11 日,百度在 X 市 XX 中学举办了一场 AI 知识小课堂,本场 AI 知识小课堂老师教授了一些矩阵的相关知识,因为矩阵在 AI 人工智能中也有相当的 ...

随机推荐

  1. 【Python学习笔记之二】浅谈Python的yield用法

    在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...

  2. oracle pl/sql 函数

    函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句.而在函数体内必须包含return语句返回的数据.我们可以使用create function来建立函数. 1).接下来通过一个案 ...

  3. Python dict operation introduce

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: d = ...

  4. Java EE开发环境——MyEclipse2017破解 和 Tomcat服务器配置

    Java EE开发,我们可以搭建如下开发环境: 底层运行环境:jdk 和 jre. Web服务器:Tomcat 后台数据库:SQL Server 可视化集成开发环境:MyEclipse Java EE ...

  5. python数据结构之栈与队列

    python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...

  6. 单独创建一个Android Test Project 时junit 的配置和使用

    现在的集成ADT后Eclipse都可以直接创建Android Test Project 如图所示: 命名后选择你要测试的单元程序,比如我自己准备测试sms,便可以如图所示那样选择 本人新建的测试工程为 ...

  7. python 发送邮件,未完

    def send_mail(): try: print "send mail..." # handle = smtplib.SMTP('smtp.163.com', 25) # h ...

  8. JAVA提高二:枚举

    JDK5.0中有一个非常有用的特性:枚举,这个特性以前在C语言中出现过,后来JDK出现后,开始觉得没有必要,但随着使用JAVA语言的人数增多,发现大家对枚举的需求非常大,于是又加入了此特性,下面我们来 ...

  9. 使用Fabric一键批量部署上线/线上环境监控

    本文讲述如何使用fabric进行批量部署上线的功能 这个功能对于小应用,可以避免开发部署上线的平台,或者使用linux expect开发不优雅的代码. 前提条件: 1.运行fabric脚本的机器和其他 ...

  10. 九大排序算法Demo

    1. 冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换, ...