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

  • 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. Not All Samples Are Created Equal: Deep Learning with Importance Sampling

    目录 概 主要内容 "代码" Katharopoulos A, Fleuret F. Not All Samples Are Created Equal: Deep Learnin ...

  2. CS5265typec转HDMI2.0方案说明书|Capstone CS5265typec转HDMI4K60HZ单转电路|瑞奇达CS5265typec拓展坞设计

    一.CS5265总概 Capstone CS5265 USB Type-C到HDMI转换器结合了USB Type-C输入接口和数字高清多媒体接口(HDMI)输出.嵌入式微控制器(MCU)基于工业标准8 ...

  3. MySQL高级查询与编程笔记 • 【第5章 常见数据库对象】

    全部章节   >>>> 本章目录 5.1 视图 5.1.1 视图的定义 5.1.2 视图的优点 5.1.3 视图的创建和使用 5.1.4 利用视图解决数据库的复杂应用 5.1. ...

  4. Android物联网应用程序开发(智慧园区)—— 园区监控系统界面

    效果图: 布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...

  5. Android 悬浮窗

    悬浮窗是一种比较常见的需求.例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情. 本文给出一个简单的悬浮窗实现.可缩小activity和还原大小.可悬浮在其他activity上.使用 ...

  6. 初识python: 面向对象是个啥?

    编程范式:编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 ,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多 ...

  7. mybatis-plus中查询出的字段为空

    数据查询出后其中几个字段为null 解决方法: 数据库的字段命名方式为使用下划线连接,对应的实体类应该是驼峰命名方式,而我使用的是和数据库同样的命名方式. 所以mybatis-plus映射不到,修改实 ...

  8. cnetos7安装字体

    1 先下载字体 链接:https://pan.baidu.com/s/1FEV7K8c8S6o3gBukkSGp4w 提取码:font 2 安装字体脚本 vi font.sh #!/bin/bash ...

  9. Zabbix监控报警Lack of free swap space on Zabbix server解决办法

    故障描述: Lack of free swap space on Zabbix server 故障原因: 情况一:云主机:因为Zabbix监控没有考虑虚拟主机的swap分区情况. 情况二:物理主机:说 ...

  10. Eureka原理与架构

    一.原理图 Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址 提供者:启动后向Eureka注册自己信息(地址,提供什么服务) 消费者:向Eureka订阅服务,Eureka会将对应服 ...