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

  • 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. Codeforces 931C:Laboratory Work(构造)

    C. Laboratory Work time limit per test : 1 second memory limit per test : 256 megabytes input : stan ...

  2. 第四十三个知识点:为AES描述一些基础的(可能无效)的对抗侧信道攻击的防御

    第四十三个知识点:为AES描述一些基础的(可能无效)的对抗侧信道攻击的防御 原文地址:http://bristolcrypto.blogspot.com/2015/07/52-things-numbe ...

  3. MongoDB基本介绍与安装(1)

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功 ...

  4. [数据结构]常见数据结构的typedef类型定义总结

    目录 数据结构类型定义: 1.线性表 线性表(顺序存储类型描述): 线性表(动态存储类型描述) 2.线性表的链式表示 双链表的结点类型描述: 静态链表结点类型的描述: 3.栈的数据结构 顺序栈的数据结 ...

  5. Linux_接收文件(rz)和发送文件(sz)

    我们连接linux通常是使用一些ssh工具进行远程访问连接的,在使用过程中,少不了将本地文件上传到linux或将linux上的文件下载到本地,每次使用ftp比较繁琐而且浪费时间.我们可以使用linux ...

  6. 单元测试 报错 org.junit.runners.model.InvalidTestClassError: Invalid test class 'com.example.xxx' 解决

    1.前言 很奇怪 ,单元测试正常执行,但是结束后会报错 org.junit.runners.model.InvalidTestClassError: Invalid test class 'com.e ...

  7. BitMap算法知识笔记以及在大数据方向的使用

    概述 所谓的BitMap算法就是位图算法,简单说就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间,这是很常用的 ...

  8. HTTP协议层面绕过WAF

    最近也是在一直看过waf相关的资料,本次主要是想写写HTTP协议层面过WAF的一些技巧,来与大家一同探讨 原理 给服务器发送payload数据包,使得waf无法识别出payload,当apache,t ...

  9. 关于包装类Integer,Long比较用==和equals的问题

    所有整型包装类对象之间值的比较,全部使用 equals 方法比较. 说明:对于 Integer var = ? 在-128 至 127 之间的赋值,Integer 对象是在 IntegerCache. ...

  10. 刨根问底: Kafka 到底会不会丢数据?

    大家好,我是 华仔, 又跟大家见面了. 上一篇作为专题系列的第二篇,从演进的角度带你深度剖析了关于 Kafka 请求处理全流程以及超高并发的网络架构设计的实现细节,今天开启第三篇,我们来聊聊 Kafk ...