核苷酸(evolution)
核苷酸(evolution)
题目描述
生物课是帕特里克最讨厌的课程,没有之一。
相比做一些无聊而又无趣的遗传题,他更喜欢其他所有的科目。
包括英语。
但是今天不同。他被一个关于RNA感染DNA的题目所吸引了。
我希望能够实现这样的一个功能。
DNA中包含四种核苷酸,上面具有不同的含氮碱基,分别是:腺嘌呤(A)、胸腺嘧啶(T)、鸟嘌呤(G)、胞嘧啶(C)。我们可以用形如ATTGCA...的字符串来代表一条脱氧核苷酸序列。
我们需要追踪一段高变异生物的核苷酸序列。在这种生物中,其DNA序列很容易发生替换,即将某一位的核苷酸替换为其他核苷酸。
我们有一段感染串,这一条DNA单链极有可能替换原来DNA链中的核苷酸。已知这条单链会作用于[l,r][l,r]中的位置。这条单链会不重叠复制成一条长链,然后顺序感染[l,r][l,r]中的核苷酸。如果两个位置间的核苷酸不同,那么DNA链上的核苷酸就会被替换。
现在研究人员想知道,对于感染串TT,在[l,r][l,r]上有多少个位置不会受到感染。
输入
第一行一串字符串,初始DNA链SS。SS仅由A,T,G,C四个大写字母组成。
接下来一行带有一个整数QQ。接下来QQ行每行一个询问,格式如下:
1 x C,表示第xx位置上的核苷酸被替换成字符CC。
2 l r T,表示有可能有一个感染串TT,在[l,r][l,r]间作用。
注意,每次感染串并不会对原串做出任何修改。
输出
对于每个查询22,输出不会受感染的核苷酸位置数量。
样例输入
【样例1输入】
ATGCATGC
4
2 1 8 ATGC
2 2 6 TTT
1 4 T
2 2 6 TA
【样例2输入】
GAGTTGTTAA
6
2 3 4 TATGGTG
1 1 T
1 6 G
2 5 9 AGTAATA
1 10 G
2 2 6 TTGT
样例输出
【样例1输出】
8
2
4
【样例2输出】
0
3
1
提示
你可以将感染串理解成一个循环节为|T||T|的无限长字符串。
请结合两个样例理解其意义。
对于30%的数据,1≤|S|,Q≤1031≤|S|,Q≤103。
对于另外10%的数据,没有修改操作。
对于另外10%的数据,基因串仅由A,T两字符构成。
对于所有数据,满足:1≤|S|,Q≤105,1≤|T|≤101≤|S|,Q≤105,1≤|T|≤10,询问中x,l,r≤|S|x,l,r≤|S|。所有字符与字符串均只包含A,T,G,C。
另,最伟大的创造是光合作用。
来源
solution
令a[p][m][r][x]表示S串中前x个位置
有多少个字母p (ATGC)的位置
模m
余r
对于每一位s[x]
a[s[x]][mod][i%mod][x]++;
前缀和维护即可
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,Q,m,a[4][11][11][100005],op,pl,l,r;
char s[100005],ch[15],dy[200],tt;
void jia(int c,int p,int r,int x,int v){
for(;x<=n;x+=(x&-x))a[c][p][r][x]+=v;
}
int cha(int c,int p,int r,int x){
int vv=0;
for(;x>0;x-=(x&-x))vv+=a[c][p][r][x];
return vv;
}
int main()
{
dy['A']=0;dy['T']=1;dy['G']=2;dy['C']=3;
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++){
for(int mod=1;mod<=10;mod++){
jia(dy[s[i]],mod,i%mod,i,1);
}
}
cin>>Q;
while(Q--){
scanf("%d",&op);
if(op==1){
scanf("%d %c",&pl,&tt);
for(int mod=1;mod<=10;mod++){
jia(dy[s[pl]],mod,pl%mod,pl,-1);
jia(dy[tt],mod,pl%mod,pl,1);
}
s[pl]=tt;
}
else {
scanf("%d%d%s",&l,&r,ch);
m=strlen(ch);
int sum=0;
for(int i=0;i<m;i++){
int s1=cha(dy[ch[i]],m,(i+l)%m,l-1);
int s2=cha(dy[ch[i]],m,(i+l)%m,r);
sum+=s2-s1;
}
printf("%d\n",sum);
}
}
return 0;
}
核苷酸(evolution)的更多相关文章
- 差分进化算法 DE-Differential Evolution
差分进化算法 (Differential Evolution) Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化 ...
- Evolution项目(1)
Evolution项目是基于NFine修改的项目 主要改动为: 支持了.net core 1.0 支持了 EF core 1.0 支持数据库自动创建及Demo数据自动灌入 修改了授权方式 新增加了一个 ...
- ubuntu 14.04 下evolution邮箱客户端设置(腾讯企业邮箱)
安装 evolution 有PPA可用,支持 Ubuntu 14.04 及衍生系统.打开终端,输入以下命令: sudo add-apt-repository ppa:fta/gnome3 sudo a ...
- 计算DNA中每种核苷酸的数目
问题描述:计算DNA中每种核苷酸的数目 输入文件内容: 代码: 输出结果:
- ON THE EVOLUTION OF MACHINE LEARNING: FROM LINEAR MODELS TO NEURAL NETWORKS
ON THE EVOLUTION OF MACHINE LEARNING: FROM LINEAR MODELS TO NEURAL NETWORKS We recently interviewed ...
- GFS: Evolution on Fast-forward
GFS: Evolution on Fast-forward by Marshall Kirk McKusick, Sean Quinlan | August 7, 2009 A discussion ...
- 长期演进技术(LTE,Long Term Evolution)
/********************************************************************************* * 长期演进技术(LTE,Long ...
- UNIX Filesystems - Evolution Design and Implementation.pdf
UNIX Filesystems - Evolution Design and Implementation.pdf
- UVA 1481 Genome Evolution
Xi, a developmental biologist is working on developmental distances of chromosomes. A chromosome, in ...
随机推荐
- form 表单 和 jQuery HTML / CSS 方法($().html 类似的样式)
1 有关链接 :http://www.runoob.com/tags/tag-form.html https://www.cnblogs.com/Jxwz/p/4509618.html https:/ ...
- gulp的常用插件
gulp和webpack的差别:https://www.cnblogs.com/lovesong/p/6413546.html var gulp = require('gulp'); var del ...
- axios常见传参方式
1:get请求 一般发送请求是这么写 axios.get('/user?id=12345&name=user') .then(function (res) { console.log(res) ...
- 51nod——1285 山峰和分段(暴力出奇迹)
要求每段的点数都一样,因此分的段数cnt肯定是n的因子,要求每段都有山峰,因此cnt肯定小于等于山峰数量.分段的宽度d=n/cnt,对山峰数量做一个前缀和,检查一下每一段的山峰数量是否没有增加即可. ...
- 洛谷P1164小A点菜
这也是一道01背包的题 用的方法比较的巧妙.这个动态规划相当于反过来做的,自己理解就知道了.代码很短 #include<bits/stdc++.h> using namespace std ...
- Java代码随机生成图片验证码
package com.rchm.util.images; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2 ...
- 搭建Nginx反向代理做内网域名转发
由于公司内网有多台服务器的 http 服务要映射到公司外网静态 IP,如果用路由的端口映射来做,就只能一台内网服务器的 80 端口映射到外网 80 端口,其他服务器的 80 端口只能映射到外网的非 8 ...
- 【PHP】什么时候使用Try Catch(转)
几条建议: 如果无法处理某个异常,那就不要捕获它. 如果捕获了一个异常,请不要胡乱处理它. 尽量在靠近异常被抛出的地方捕获异常. 在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出. 按 ...
- 科学计算库Numpy——数组形状
改变数组维数 给数组的shape属性赋值,改变数组的维数.数组的大小是不能改变的. 增加维度 使用np.newaxis增加维度. 删除维度 使用squeeze()删除维度是1的维度,也就是删除shap ...
- Codeforces Round #464 (Div. 2) E. Maximize!
题目链接:http://codeforces.com/contest/939/problem/E E. Maximize! time limit per test3 seconds memory li ...