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

  • 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. CS5266 Type-C转HDMI+PD3.0+USB3.0 三合一拓展坞电路设计

    CS5266 Type-C转HDMI+PD3.0+USB3.0 三合一拓展坞电路设计 CS5266是一款带PD3.0快充 Type-C转HDMI 4K30HZ音视频转换芯片.CS5266支持PD3.0 ...

  2. 利用自定义动画 animate() 方法,实现某图书网站中“近 7 日畅销榜”中的图书无缝垂直向上滚动特效:当光标移入到图书上时,停止滚动,鼠标移开时,继续滚动

    查看本章节 查看作业目录 需求说明: 利用自定义动画 animate() 方法,实现某图书网站中"近 7 日畅销榜"中的图书无缝垂直向上滚动特效:当光标移入到图书上时,停止滚动,鼠 ...

  3. 在页面中添加两个 <select> 标签,用来显示年份和月份;同时添加两个 <ul> 标签,一个用来显示星期,另一个用来显示日期 在 JavaScript 脚本中动态添加年份和月份,获取当前日期的年份

    查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的 Date 对象,在页面上显示一个万年历.选择不同的年份和月份,在页面中显示当前月的日历 实现思路: 在页面中添加两个 <s ...

  4. 编写Java程序,模拟五子棋博弈过程中的异常声明和异常抛出

    返回本章节 返回作业目录 需求说明: 模拟五子棋博弈过程中的异常声明和异常抛出,判断用户所下棋子的位置,是否超越了棋盘的边界. 棋盘的横坐标的范围为0-9,纵坐标范围为0-14,如果用户所放棋子的坐标 ...

  5. Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据

    什么是流处理 如果有 java 使用经验的同学一定会对 java8 的 Stream 赞不绝口,极大的提高了们对于集合类型数据的处理能力. int sum = widgets.stream() .fi ...

  6. VMware客户端vSphereClient新建虚拟机

    1.说明 VMware客户端工具vSphere Client, 用来连接和管理ESX或ESXi主机(下面称为宿主机), 可以方便的创建.管理虚拟机,并分配相应的资源.宿主机就是使用虚拟化软件运行虚拟机 ...

  7. Zookeeper集群安装(开启kerberos)

    安装规划 zookeeper集群模式,安装到如下三台机器 10.43.159.237 zdh-237 10.43.159.238 zdh-238 10.43.159.239 zdh-239 Kerbe ...

  8. 【计项02组01号】Java版图形界面计算器

    Java版图形界面计算器1.0版本 项目分析[1.0] 组成部分 代码结构 (1)窗口的创建 在<JDK 核心 API>中我们提到,创建一个窗口需要使用 JFrame 类.在本实验中,我们 ...

  9. i++ 和 ++i 区别

    i++:是先把i拿出来使用,然后再+1: ++i :是先把i+1,然后再拿出来使用:

  10. SYCOJ1793

    题目-统计单词前缀数 (shiyancang.cn) 1 #include<bits/stdc++.h> 2 using namespace std; 3 map<string,in ...