当前位置 博文首页 > 文章内容

    AT2395 [ARC071C] TrBBnsformBBtion

    作者: 栏目:未分类 时间:2020-10-24 18:00:58

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    基于观察的构造题

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

    • 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;
    }