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

    angular.js路由功能 用于实现单页应用 //html 代码 <div ng-view></div> //js代码 angular.module('myM1',['ng' ...

  2. 读Zepto源码之Gesture模块

    Gesture 模块基于 IOS 上的 Gesture 事件的封装,利用 scale 属性,封装出 pinch 系列事件. 读 Zepto 源码系列文章已经放到了github上,欢迎star: rea ...

  3. 【POJ】 1061 青蛙的约会(扩欧)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 119148   Accepted: 25070 Descript ...

  4. 快速双边滤波 附完整C代码

    很早之前写过<双边滤波算法的简易实现bilateralFilter>. 当时学习参考的代码来自cuda的样例. 相关代码可以参阅: https://github.com/johng12/c ...

  5. vue数组语法兼容问题

    先来一行代码: <a :href="['NewsNote.asp?ID='+item.ID+'&MenuType=C']" v-text="item.Tit ...

  6. 【归纳整理】Ajax / JSON / WEB存储 / iframe

      Ajax 一.什么是 AJAX ? AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页 ...

  7. JavaWeb(五)之JSTL标签库

    前言 前面介绍了EL表达式,其实EL表达式基本上是和JSTL核心标签库搭配一起使用才能发挥效果的.接下来让我们一起来认识一下吧! 在之前我们学过在JSP页面上为了不使用脚本,所以我们有了JSP内置的行 ...

  8. 手把手教你用npm发布一个包,详细教程

    我们已经实现了路由的自动化构建,但是我们可以看到,一大串代码怼在里面.当然你也可以说,把它封装在一个JS文件里面,然后使用require('./autoRoute.js')给引入进来,那也行.但是,为 ...

  9. MVVM前后分离轻量级框架应用juicer和doT.js

    前言      前后端开发分的越来越细化,为了方便前端工程师更好的调试后端工程师嵌套的代码,前后分离技术就出现了,简单理解其实就是Ajax异步将数据提供给JavaScript,由JavaScript进 ...

  10. 聊聊Java中几种常用的设计模式

    1.单例模式(有的书上说叫单态模式其实都一样) 该模式主要目的是使内存中保持1个对象.看下面的例子: package org.sp.singleton; //方法一 public class Sing ...