计蒜之道 初赛第一场B 阿里天池的新任务(简单)
阿里“天池”竞赛平台近日推出了一个新的挑战任务:对于给定的一串 DNA 碱基序列 tt,判断它在另一个根据规则生成的 DNA 碱基序列 ss 中出现了多少次。
首先,定义一个序列 ww:
\displaystyle w_{i} = \begin{cases}b, & i = 0\\(w_{i-1} + a) \mod n, & i > 0\end{cases}wi={b,(wi−1+a)modn,i=0i>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}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)
其中 \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。第二行为一个仅包含A
、T
、G
、C
的一个序列 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∣≤106,a,na,n 互质。
对于简单版本,1 \leq n \leq 10^{6}1≤n≤106;
对于中等版本,1 \leq n \leq 10^{9}, a = 11≤n≤109,a=1;
对于困难版本,1 \leq n \leq 10^{9}1≤n≤109。
输出格式
输出一个整数,为 tt 在 ss 中出现的次数。
样例说明
对于第一组样例,生成的 ss 为TTTCGGAAAGGCC
。
样例输入1
- 13 2 5 4 9
- AGG
样例输出1
- 1
样例输入2
- 103 51 0 40 60
- ACTG
样例输出2
- 5
构造序列,然后就是裸的KMP,第一场就出线,好幸运哈哈哈哈哈哈
- /*
- * @Author: lyucheng
- * @Date: 2017-05-20 18:55:59
- * @Last Modified by: lyucheng
- * @Last Modified time: 2017-05-20 20:43:25
- */
- #include <bits/stdc++.h>
- #define LL long long
- using namespace std;
- LL res=;
- /*******************KMP模板***********************/
- void makeNext(const char P[],LL Next[])
- {
- /*
- Next[i]表示前i个字符中,最大前后缀相同的长度
- */
- LL q,k;
- LL m=strlen(P);
- Next[]=;
- for (q=,k=;q<m;++q)
- {
- while(k>&&P[q]!=P[k])
- k = Next[k-];
- /*
- 这里的while循环很不好理解!
- 就是用一个循环来求出前后缀最大公共长度;
- 首先比较P[q]和P[K]是否相等如果相等的话说明已经K的数值就是已匹配到的长的;
- 如果不相等的话,那么Next[k-1]与P[q]的长度,为什么呐?因为当前长度不合适
- 了,不能增长模板链,就缩小看看Next[k-1]
- 的长度能够不能和P[q]匹配,这么一直递归下去直到找到
- */
- if(P[q]==P[k])//如果当前位置也能匹配上,那么长度可以+1
- {
- k++;
- }
- Next[q]=k;
- }
- }
- void kmp(const char T[],const char P[],LL Next[])
- {
- LL n,m;
- LL i,q;
- n = strlen(T);
- m = strlen(P);
- makeNext(P,Next);
- for (i=,q=;i<n;++i)
- {
- while(q>&&P[q]!= T[i])
- q = Next[q-];
- /*
- 这里的循环就是位移之后P的前几个字符能个T模板匹配
- */
- if(P[q]==T[i])
- {
- q++;
- }
- if(q==m)//如果能匹配的长度刚好是T的长度那么就是找到了一个能匹配成功的位置
- {
- res++;
- }
- }
- }
- /*******************KMP模板***********************/
- LL n,a,b,L,R;
- char t[];//用来匹配的子串
- char p[];
- LL Next[];
- LL last,now;
- LL len=;
- int main(){
- // freopen("in.txt","r",stdin);
- scanf("%lld%lld%lld%lld%lld",&n,&a,&b,&L,&R);
- scanf("%s",t);
- for(int i=;i<n;i++){
- if(i==){
- now=b;
- if(now>=L&&now<=R){
- if(now%==){
- p[len++]='A';
- }else{
- p[len++]='T';
- }
- }else{
- if(now%==){
- p[len++]='G';
- }else{
- p[len++]='C';
- }
- }
- }else{
- now=(last+a)%n;
- if(now>=L&&now<=R){
- if(now%==){
- p[len++]='A';
- }else{
- p[len++]='T';
- }
- }else{
- if(now%==){
- p[len++]='G';
- }else{
- p[len++]='C';
- }
- }
- }
- last=now;
- }
- makeNext(t,Next);
- kmp(p,t,Next);
- printf("%lld\n",res);
- return ;
- }
计蒜之道 初赛第一场B 阿里天池的新任务(简单)的更多相关文章
- 2017 计蒜之道 初赛 第一场 B阿里天池的新任务(简单)
题链:"https://nanti.jisuanke.com/t/15500" 本来希望通过找循环节然后套KMP来通过后面题的,可是只过了B题,可能循环节不一定是存在的. #inc ...
- 2017 计蒜之道 初赛 第一场 A 阿里的新游戏
题链:https://nanti.jisuanke.com/t/15499 这题观察图纸可知成三线段上的相邻点之间的距离有1,2,3三种情况的,同时要成线段必然是同横坐标或者纵坐标,然后我们排除掉穿过 ...
- 2017 计蒜之道 初赛 第一场 A、B题
A题 阿里的新游戏 题目概述: 阿里九游开放平台近日上架了一款新的益智类游戏——成三棋.成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示: 成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋 ...
- 2018 计蒜之道-初赛 第一场 A-百度无人车
百度一共制造了 nn 辆无人车,其中第 ii 辆车的重量为 a_i\ \mathrm{kg}ai kg. 由于车辆过重会增大轮胎的磨损程度,现在要给这 nn 辆车减轻重量.每将一辆车减轻 1\ \m ...
- 2016 计蒜之道 初赛 第一场 D 青云的机房组网方案 (虚树)
大意: 给定树, 点$i$的点权为$a_i$, 求$\sum\limits_{a_i \perp a_j}dis(i,j)$ 中等难度可以枚举每条边的贡献, 维护子树内每个数出现次数$a$, 转化为求 ...
- 2019 计蒜之道 初赛 第一场 商汤的AI伴游小精灵
https://nanti.jisuanke.com/t/39260 根据题意我们可以知道 这是一个树 我们只需要找到出度最大的两个点就好了 如果包含根节点的话要-- 两个点相邻的话也要-- 数据很 ...
- 2019 计蒜之道 初赛 第一场 商汤AI园区的n个路口(中等) (树形dp)
北京市商汤科技开发有限公司建立了新的 AI 人工智能产业园,这个产业园区里有 nn 个路口,由 n - 1n−1 条道路连通.第 ii 条道路连接路口 u_iui 和 v_ivi. 每个路口都布有 ...
- 2019 计蒜之道 初赛 第二场 B. 百度AI小课堂-上升子序列(简单) ( 实现)
题目背景 91029102 年 99 月 22 日,百度在 X 市 XX 中学举办的第一场 AI 知识小课堂大获好评!同学们对矩阵的掌握非常棒. 今天的 AI 知识小课堂的第二场开讲啦.本场 AI ...
- 2019 计蒜之道 初赛 第二场 A 百度AI小课堂-矩阵问题 ( 等差数列求和公式)
题目背景 91029102 年 99 月 11 日,百度在 X 市 XX 中学举办了一场 AI 知识小课堂,本场 AI 知识小课堂老师教授了一些矩阵的相关知识,因为矩阵在 AI 人工智能中也有相当的 ...
随机推荐
- angular学习笔记01
angular.js路由功能 用于实现单页应用 //html 代码 <div ng-view></div> //js代码 angular.module('myM1',['ng' ...
- 读Zepto源码之Gesture模块
Gesture 模块基于 IOS 上的 Gesture 事件的封装,利用 scale 属性,封装出 pinch 系列事件. 读 Zepto 源码系列文章已经放到了github上,欢迎star: rea ...
- 【POJ】 1061 青蛙的约会(扩欧)
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 119148 Accepted: 25070 Descript ...
- 快速双边滤波 附完整C代码
很早之前写过<双边滤波算法的简易实现bilateralFilter>. 当时学习参考的代码来自cuda的样例. 相关代码可以参阅: https://github.com/johng12/c ...
- vue数组语法兼容问题
先来一行代码: <a :href="['NewsNote.asp?ID='+item.ID+'&MenuType=C']" v-text="item.Tit ...
- 【归纳整理】Ajax / JSON / WEB存储 / iframe
Ajax 一.什么是 AJAX ? AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页 ...
- JavaWeb(五)之JSTL标签库
前言 前面介绍了EL表达式,其实EL表达式基本上是和JSTL核心标签库搭配一起使用才能发挥效果的.接下来让我们一起来认识一下吧! 在之前我们学过在JSP页面上为了不使用脚本,所以我们有了JSP内置的行 ...
- 手把手教你用npm发布一个包,详细教程
我们已经实现了路由的自动化构建,但是我们可以看到,一大串代码怼在里面.当然你也可以说,把它封装在一个JS文件里面,然后使用require('./autoRoute.js')给引入进来,那也行.但是,为 ...
- MVVM前后分离轻量级框架应用juicer和doT.js
前言 前后端开发分的越来越细化,为了方便前端工程师更好的调试后端工程师嵌套的代码,前后分离技术就出现了,简单理解其实就是Ajax异步将数据提供给JavaScript,由JavaScript进 ...
- 聊聊Java中几种常用的设计模式
1.单例模式(有的书上说叫单态模式其实都一样) 该模式主要目的是使内存中保持1个对象.看下面的例子: package org.sp.singleton; //方法一 public class Sing ...