CodeForces 828E DNA Evolution(树状数组)题解
题意:给你一个串k,进行两个操作:
“1 a b”:把a位置的字母换成b
“2 l r s”:求l到r有多少个字母和s匹配,匹配的条件是这样:从l开始无限循环s形成一个串ss,然后匹配ss和指定区间的匹配个数,如图。
思路:用树状数组预处理。因为模板串是不断重复循环的,所以我们可以一个位置一个位置求。对于长len的模板串来说,如果位置i,j满足 i%len == j%len,那么i和j匹配时对模板串来说是一样的(匹配同一个字符)。所以我们定义node[字母][模板串长度][相对位置][位置]来遍历某个位置字符在所有可能的相对位置的情况。
参考:Codeforces - 828E DNA Evolution —— 很多棵树状数组
代码:
#include<stack> #include<vector> #include<queue> #include<set> #include<cstring> #include<string> #include<sstream> #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define ll long long #define ull unsigned long long using namespace std; const int maxn = 100000 + 10; const int seed = 131; const int MOD = 100013; const int INF = 0x3f3f3f3f; char s[maxn]; int h[255]; int node[5][11][11][maxn]; int lowbit(int x){return x&(-x); } void update(int letter, int x, int val){for(int i = x; i < maxn; i += lowbit(i)){for(int len = 1; len <= 10; len++){node[letter][len][x % len][i] += val;}} } int sum(int letter, int x, int len, int pos){int ans = 0;for(int i = x; i > 0; i -= lowbit(i)){ans += node[letter][len][pos][i];}return ans; } int query(int l, int r, int len, int letter, int pos){return sum(letter, r, len, pos) - sum(letter, l - 1, len, pos); } int main(){memset(node, 0 , sizeof(node));h['A'] = 1, h['G'] = 2, h['C'] = 3, h['T'] = 4;scanf("%s", s + 1);int len = strlen(s + 1);for(int i = 1; i <= len; i++){update(h[s[i]], i, 1);}int q;scanf("%d", &q);while(q--){int o,u,v;char ss[12];scanf("%d", &o);if(o == 1){scanf("%d%s", &u, ss);update(h[s[u]], u, -1);update(h[ss[0]], u, 1);s[u] = ss[0];}else{scanf("%d%d%s", &u, &v, ss);len = strlen(ss);int ans = 0;for(int i = 0; i < len; i++){ans += query(u, v, len, h[ss[i]], (u + i) % len);}printf("%d\n", ans);}}return 0; } /* ATGCATGC 4 2 1 8 ATGC 2 2 6 TTT 1 4 T 2 2 6 TA */
转载于:https://www.cnblogs.com/KirinSB/p/9529853.html
CodeForces 828E DNA Evolution(树状数组)题解相关推荐
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组
链接: http://codeforces.com/contest/828/problem/E 题解: 给你一个字符串s q次操作 op==1 改变s[pos]位置的字符 op==2 将字符串e复 ...
- 【数据结构2-2】线段树与树状数组 题解
头一次老老实实写完一个官方题单,发篇题解纪念一下-- 文章目录 P3372 [模板]线段树 1 P3373 [模板]线段树 2 P4588 [TJOI2018]数学计算 P1502 窗口的星星 P24 ...
- CodeForces - 1288E Messenger Simulator(树状数组)
题目链接:点击查看 题目大意:给出n和m,表示n个人和m个操作,每次操作会将一个数x放到首位置上来,其他数往后顺延,比如: 初始时的数组为[4,1,5,3,2],当第一个x为 3 ,则序列变为[3,4 ...
- Codeforces Round #413 C-Fountains 树状数组
题意 本题给我们给我们两种货币初始金额 每种货币分别对应能买不同种类的喷泉 每个喷泉有花费和价值 问我们如果单纯建造两个喷泉在限定金额内的最大值 分析 考虑一下 发现有三种情况 1 两个喷泉从coin ...
- Codeforces 1139F Dish Shopping 树状数组套平衡树 || 平衡树
Dish Shopping 将每个物品拆成p 和 s 再加上人排序. 然后问题就变成了, 对于一个线段(L - R), 问有多少个(li, ri)满足 L >= li && R ...
- 树状数组求逆序对_区间和的个数(树状数组)
327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...
- 【树状数组】CF961E Tufurama
挺巧妙的数据结构题(不过据说这是一种套路? E. Tufurama One day Polycarp decided to rewatch his absolute favourite episode ...
- Array Optimization by Deque (cf)树状数组
原题链接:Problem - 1579E2 - Codeforces 今天学了树状数组,好牛,一个题想了一晚上才明白呜呜 1.首先这个题要想明白,每次插入一个数的时候,如果这个数插在队列的最前面,那么 ...
- CodeForces 869E The Untended Antiquity 二维树状数组,随机hash
CodeForces 869E 题意: n*m 的格子,有三种操作, 1.在一个矩形周围加一层障碍.2.把一个矩形周围的障碍去掉. 3.询问两个格子是否可达. 题目保证不会有矩形障碍交叉,且去 ...
最新文章
- 漫画:百度从Google学来的面试题,想进大厂必备!
- 美宣布制裁中兴通讯 商务部:坚决反对并将交涉
- linux系统怎么安装pr,Linux安装后的配置
- 关于安装deepin+window10双系统有时没有声音的问题
- jQuery动态增加表格一行和删除一行
- 梅特勒托利多xk3124电子秤说明书_托利多电子秤使用说明
- VS2010下C/C++连接MySql数据库的方法
- 通过Shiny app实现疫苗预防疾病的过程
- 【Java开发】Java实现黑客帝国代码雨
- 关于火狐浏览器国际版和国内版的说明
- wmic冻结进程_WMIC的用法
- 什么是安全漏洞扫描?
- fastq与fasta文件格式解析
- 相对定位 绝对定位 固定定位 粘性定位 居中的三种方法 calc函数标签的使用方法
- java游泳馆浴池管理系统-小程序
- 深剖C++内联函数和引用机制
- 2023-spring 2.探险营地 — 字符串
- 丁香医生vue开发项目,接口用的主要是官方开放的Api接口,无后端
- tab栏切换html
- 导频、SIC串行干扰抵消