基于观察,可以发现以下两条性质:

  • A 可以到 BBBB 也可以到 A,对 B <-> AA 也是同理的。

  • 可以通过这两个操作交换相邻元素。

对于前者,只需证明 BB 可以到 A 即可,不难发现有构造:BB -> AAAA -> A

对于后者,不妨设相邻两项为 AB 则不难发现有构造 AB -> AAA -> BA

于此同时可以发现,这两个操作都是双向等价的,因此我们通过这两个操作得到的串是和原串等价的。

那么可以考虑使用上述两个操作将 \(S, T\) 串变为最简单的全 A 串来继续观察。

继续观察可以发现:一个全 A 串不可能通过操作去掉两个 A 或一个 A,因为最多只能增加 \(3k\) 个 A,同时只能减去三个 AA 的数量不变。

因此,我们只能最终只能增加或减少 \(3k\) 个 A,因此只需要比较 \(S, T\) 串变成全 A 串后 A 的数量之差是否为 \(3\) 的倍数即可。

不难发现只需要记录前缀和即可,复杂度 \(O(n + q)\)。

#include <bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for (int i = l; i <= r; ++i)
const int N = 1e5 + 5;
int n, m, q, a, b, c, d, cnt[2][N][2]; char s[N], t[N];
int read() {
char c; int x = 0, f = 1;
c = getchar();
while (c > '9' || c < '0') { if(c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int main() {
scanf("%s%s", s + 1, t + 1), n = strlen(s + 1), m = strlen(t + 1);
rep(i, 1, n) {
cnt[0][i][0] = cnt[0][i - 1][0] + (s[i] == 'A');
cnt[0][i][1] = cnt[0][i - 1][1] + (s[i] == 'B');
}
rep(i, 1, m) {
cnt[1][i][0] = cnt[1][i - 1][0] + (t[i] == 'A');
cnt[1][i][1] = cnt[1][i - 1][1] + (t[i] == 'B');
}
q = read();
while (q--) {
a = read(), b = read(), c = read(), d = read();
int Nas = cnt[0][b][0] - cnt[0][a - 1][0], Nbs = cnt[0][b][1] - cnt[0][a - 1][1];
int Nat = cnt[1][d][0] - cnt[1][c - 1][0], Nbt = cnt[1][d][1] - cnt[1][c - 1][1];
if(Nas < Nat) printf((Nbs - Nbt - (Nat - Nas) * 2) % 3 == 0 ? "YES\n" : "NO\n");
else printf((Nbs + (Nas - Nat) * 2 - Nbt) % 3 == 0 ? "YES\n" : "NO\n");
}
return 0;
}

AT2395 [ARC071C] TrBBnsformBBtion的更多相关文章

  1. [字符串]TrBBnsformBBtion

    TrBBnsformBBtion Let us consider the following operations on a string consisting of A and B: Select ...

  2. AtCoder Regular Contest 071

    C - 怪文書 / Dubious Document 题意:定义一种无序的子序列:在原串中随意地取字符并随意打乱顺序.求多个字符串的最长公共无序子序列. #include<cstdio> ...

  3. 【AtCoder】ARC071

    ARC071 C - 怪文書 / Dubious Document 题目大意:给n个字符串,每个字符串可以通过扔掉一些字母将剩下的字母重排得到新的字符串,求n个字符串都能拼出的字符串且长度最大,若有多 ...

  4. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

随机推荐

  1. MySQL 高级内容

    MyISAM 和 MEMORY 存储引擎支持表级锁定(table-level locking),InnoDB 存储引擎支持行级锁定(row-level locking),BDB 存储引擎支持页级锁定( ...

  2. <数据结构>图的构建与基本遍历方法

    目录 建立一个图 邻接矩阵 邻接表 深度优先遍历(DFS) 具体步骤: 第一部分:给定结点u,遍历u所在的连通块的所有结点 第二部分:对图G所有结点进行第一部分的操作,即遍历了图的所有连通分量 伪代码 ...

  3. vue为什么要设计成异步队列渲染

    异步队列渲染 上一篇文章是在vue2.0 中通过Object.defineProperty去拦截并监听数据变化的响应式原理,这篇文章将会沿着图谱继续深入探索,在依赖被通知变化了之后,会触发vue当中的 ...

  4. Ranger-AdminServer安装

    Ranger-AdminServer安装,对应的Ranger版本1.0.0. RangerAdmin安装依赖如下组件: mysql solr IP/机器名 安装软件 运行进程 zdh-245 Rang ...

  5. Kerberos打开debug日志

    在JVM的启动参数中加入如下配置,打开kerberos的debug开关: -Dsun.security.krb5.debug=true JVM启动后,kerberos的相关日志会打印到控制台中, 因为 ...

  6. CSS基础 装饰 元素本身隐藏和显示效果及案例

    1.visibility:hidden; 2.display: none: 区别: 1.visibility:hidden 隐藏元素本身,且在网页中 占位置 2.display:none; 隐藏元素本 ...

  7. python+pytest,通过自定义命令行参数,实现浏览器兼容性跑用例

    场景拓展: UI自动化可能需要指定浏览器进行测试,为了做成自定义配置浏览器,可以通过动态添加pytest的命令行参数,在执行的时候,获取命令行传入的参数,在对应的浏览器执行用例. 1.自动化用例需要支 ...

  8. JMeter_实现算法加密

    JMeter有两种方法可以实现算法加密 一.使用__digest自带函数      参数说明: Digest algorithm:算法摘要,可输入值:MD2.MD5.SHA-1.SHA-224.SHA ...

  9. httprunner2.0 概述及使用说明

    一.概述 HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种测试需求. 二.系统流程 ...

  10. MySQL主从复制作用和配置

    一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...