题意:给你一个串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(树状数组)题解相关推荐

  1. 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-2】线段树与树状数组 题解

    头一次老老实实写完一个官方题单,发篇题解纪念一下-- 文章目录 P3372 [模板]线段树 1 P3373 [模板]线段树 2 P4588 [TJOI2018]数学计算 P1502 窗口的星星 P24 ...

  3. CodeForces - 1288E Messenger Simulator(树状数组)

    题目链接:点击查看 题目大意:给出n和m,表示n个人和m个操作,每次操作会将一个数x放到首位置上来,其他数往后顺延,比如: 初始时的数组为[4,1,5,3,2],当第一个x为 3 ,则序列变为[3,4 ...

  4. Codeforces Round #413 C-Fountains 树状数组

    题意 本题给我们给我们两种货币初始金额 每种货币分别对应能买不同种类的喷泉 每个喷泉有花费和价值 问我们如果单纯建造两个喷泉在限定金额内的最大值 分析 考虑一下 发现有三种情况 1 两个喷泉从coin ...

  5. Codeforces 1139F Dish Shopping 树状数组套平衡树 || 平衡树

    Dish Shopping 将每个物品拆成p 和 s 再加上人排序. 然后问题就变成了, 对于一个线段(L - R), 问有多少个(li, ri)满足  L >= li && R ...

  6. 树状数组求逆序对_区间和的个数(树状数组)

    327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...

  7. 【树状数组】CF961E Tufurama

    挺巧妙的数据结构题(不过据说这是一种套路? E. Tufurama One day Polycarp decided to rewatch his absolute favourite episode ...

  8. Array Optimization by Deque (cf)树状数组

    原题链接:Problem - 1579E2 - Codeforces 今天学了树状数组,好牛,一个题想了一晚上才明白呜呜 1.首先这个题要想明白,每次插入一个数的时候,如果这个数插在队列的最前面,那么 ...

  9. CodeForces 869E The Untended Antiquity 二维树状数组,随机hash

    CodeForces 869E 题意: n*m 的格子,有三种操作, 1.在一个矩形周围加一层障碍.2.把一个矩形周围的障碍去掉. 3.询问两个格子是否可达.     题目保证不会有矩形障碍交叉,且去 ...

最新文章

  1. 漫画:百度从Google学来的面试题,想进大厂必备!
  2. 美宣布制裁中兴通讯 商务部:坚决反对并将交涉
  3. linux系统怎么安装pr,Linux安装后的配置
  4. 关于安装deepin+window10双系统有时没有声音的问题
  5. jQuery动态增加表格一行和删除一行
  6. 梅特勒托利多xk3124电子秤说明书_托利多电子秤使用说明
  7. VS2010下C/C++连接MySql数据库的方法
  8. 通过Shiny app实现疫苗预防疾病的过程
  9. 【Java开发】Java实现黑客帝国代码雨
  10. 关于火狐浏览器国际版和国内版的说明
  11. wmic冻结进程_WMIC的用法
  12. 什么是安全漏洞扫描?
  13. fastq与fasta文件格式解析
  14. 相对定位 绝对定位 固定定位 粘性定位 居中的三种方法 calc函数标签的使用方法
  15. java游泳馆浴池管理系统-小程序
  16. 深剖C++内联函数和引用机制
  17. 2023-spring 2.探险营地 — 字符串
  18. 丁香医生vue开发项目,接口用的主要是官方开放的Api接口,无后端
  19. tab栏切换html
  20. 导频、SIC串行干扰抵消

热门文章

  1. 【WPF】添加自定义字体
  2. oralce 创建用户和权限
  3. MODIS数据的简介和下载(三)——MODIS数据下载方式(基于MODIS Web Service)
  4. Apache http server2.4 64位绿色解压版的安装、部署、启动和使用说明
  5. iOS真机UI调试利器——Reveal
  6. 基础学习 Linux命令
  7. 在一切都是虚的世界里,你能做的是什么?
  8. CentOS Repos
  9. ICONV for Windows
  10. [Java] 蓝桥杯 BASIC-5 基础练习 查找整数