题目链接

Picking String

题意

给出字符串S和T,1e5个询问,每次询问S的一段区间是否能转变成T的一段区间。
转变方式:

  • A>BCA>BCA>BC
  • B>ACB>ACB>AC
  • C>ABC>ABC>AB
  • AAAAAAAAA可以消除

题解

我们从以上四个条件出发推导出更加精华的条件

  • B>AC>AAB>AAAC>CB>AC>AAB>AAAC>CB>AC>AAB>AAAC>C
  • C>AB>AAC>AAAB>BC>AB>AAC>AAAB>BC>AB>AAC>AAAB>B
  • A>BC>BBA>BC>BBA>BC>BB

也就是说所有的CCC都等价于B" role="presentation" style="position: relative;">BBB

由于B>ACB>ACB>AC也就是B>ABB>ABB>AB,而3个AAA可以消除,这个操作意味着B前面可以有任意多个A" role="presentation" style="position: relative;">AAA,所以说,BBB前面的紧贴着的A" role="presentation" style="position: relative;">AAA的数量我们可以忽略。

由于B>AB>BBB>ABBB>BBBBB,A>BB>ABB>BBBBB>AB>BBB>ABBB>BBBBB,A>BB>ABB>BBBBB>AB>BBB>ABBB>BBBBB,A>BB>ABB>BBBB也就是说,我们只要有一个AAA或者B" role="presentation" style="position: relative;">BBB就可以在这基础上增加偶数个BBB。
那么问题就比较清楚了。

但是T[c,d]" role="presentation" style="position: relative;">T[c,d]T[c,d]T[c,d]串最后的AAA是一定要被S[a,b]" role="presentation" style="position: relative;">S[a,b]S[a,b]S[a,b]最后的A抵消掉,因为没有操作可以生成A并且把A插入到S[a,b]S[a,b]S[a,b]的最后。

分如下情况讨论:

  • 如果S[a,b]S[a,b]S[a,b]最后的AAA不足以抵消掉T[a,b]" role="presentation" style="position: relative;">T[a,b]T[a,b]T[a,b]的A,那么输出0,否则记录S[a,b]后面的A与T[a,b]的后面的A的差值,记做delta2delta2delta2。

  • 如果delta2=0delta2=0delta2 = 0那么只需要比较S[a,b]S[a,b]S[a,b]中的BBB的数量和T[c,d]" role="presentation" style="position: relative;">T[c,d]T[c,d]T[c,d]中的BBB的数量,如果T[c,d]" role="presentation" style="position: relative;">T[c,d]T[c,d]T[c,d]中BBB的数量大于S[a,b]" role="presentation" style="position: relative;">S[a,b]S[a,b]S[a,b]中BBB的数量,那么差值必定要为2的倍数,并且如果T[c,d]" role="presentation" style="position: relative;">T[c,d]T[c,d]T[c,d]中BBB的数量不为0,那么S[a,b]" role="presentation" style="position: relative;">S[a,b]S[a,b]S[a,b]中BBB的数量也必须不为0(无法从空串生成BB" role="presentation" style="position: relative;">BBBBBB)。

  • 如果delta2>0delta2>0delta2 > 0那么如果S[a,b]S[a,b]S[a,b]中BBB的数量小于T[c,d]" role="presentation" style="position: relative;">T[c,d]T[c,d]T[c,d]中B的数量,并且差值为偶数时候,S[a,b]S[a,b]S[a,b]多出来的AAA可以用来生成BB" role="presentation" style="position: relative;">BBBBBB,并且多余的A作为B的前缀可以被消除掉。

  • 如果delta2>0delta2>0delta2 > 0那么如果S[a,b]S[a,b]S[a,b]中BBB的数量等于T[c,d]" role="presentation" style="position: relative;">T[c,d]T[c,d]T[c,d]中B的数量,那么delta2delta2delta2一定要被3整除。这样可以通过消除来得到TT<script type="math/tex" id="MathJax-Element-56">T</script>


代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 2e5+7;
char S[maxn],T[maxn];
int Q,a,b,c,d;
int sumS[maxn],sumT[maxn];
int lastS[maxn],lastT[maxn];
int main(){scanf(" %s %s %d",S,T,&Q);for(int i = 0;S[i];++i){sumS[i+1] = sumS[i] + (S[i] == 'C' || S[i] == 'B');lastS[i+1] = lastS[i];if(S[i] == 'B' || S[i] == 'C')lastS[i+1] = i+1;}for(int i = 0;T[i];++i){sumT[i+1] = sumT[i] + (T[i] == 'C' || T[i] == 'B');lastT[i+1] = lastT[i];if(T[i] == 'B' || T[i] == 'C')lastT[i+1] = i+1;}while(Q--){scanf("%d%d%d%d",&a,&b,&c,&d);int delta = sumT[d]-sumS[b]+sumS[a-1]-sumT[c-1];int delta2 = b - max(a-1,lastS[b]) - (d - max(c-1,lastT[d]));if(delta < 0 || delta % 2 != 0 || delta2 < 0 || delta2 == 0 && !(sumS[b] - sumS[a-1]) && delta > 0) {putchar('0');continue;}if(delta2 == 0 || delta > 0 || delta2 % 3 == 0)putchar('1');else putchar('0');}return 0;
}

codeforces E. Picking Strings 构造相关推荐

  1. 【CodeForces】947 D. Picking Strings

    [题目]D. Picking Strings [题意]给定只含'A','B','C'的字符串,支持以下变换:1.A - BC   2.B - AC   3.C - AB   4.AAA - empty ...

  2. codeforces 616F Expensive Strings

    codeforces 616F Expensive Strings (广义后缀自动机) https://codeforces.com/contest/616/problem/F 题意: 给你n个字符串 ...

  3. cf 923D Picking Strings

    一 原题 E. Picking Strings time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  4. CodeForces - 287C Lucky Permutation(构造)

    题目链接:点击查看 题目大意:构造一个合法的排列,满足 ppi=n−i+1p_{p_{i}}=n-i+1ppi​​=n−i+1 题目分析:因为第四个样例的存在降低了本题的难度,不然感觉还是有点难度的一 ...

  5. CodeForces - 468C Hack it!(构造+数位dp)

    题目链接:点击查看 题目大意:求出一段区间 [l,r][l,r][l,r] 的数位和对 aaa 取模后为 000.更具体的,设 f(x)f(x)f(x) 为 xxx 的数位和,本题需要求出一对 [l, ...

  6. CodeForces - 1561E Bottom-Tier Reversals(构造)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的排列,每次操作可以选择一个奇数长度的前缀然后反转,需要构造一种方案,使得在不超过 5n2\frac{5n}{2}25n​ 次操作后使得序列有序 ...

  7. CodeForces - 1494E A-Z Graph(构造+思维)

    题目链接:https://vjudge.net/problem/CodeForces-1494E 题目大意:给出一个初始时只有 nnn 个点的有向带权图,需要执行 mmm 次操作,每次操作分为下列三种 ...

  8. CodeForces - 1494D Dogeforces(贪心+构造)

    题目链接:点击查看 题目大意:给出 nnn 个叶子结点和一个 n∗nn*nn∗n 的 LCALCALCA 矩阵,其中 LCALCALCA 表示的是最近公共祖先节点的权值,现在需要构造出一棵自顶向下权值 ...

  9. CodeForces - 148C Terse princess (构造)

    题目链接:http://codeforces.com/problemset/problem/148/C点击打开链接 C. Terse princess time limit per test 1 se ...

最新文章

  1. Oracle根据日期区间查询Date类型的数据
  2. 有史以来最会写代码的农民诞生!腾讯元老、上市公司CTO赚够钱后辞职!到安徽农村隐居,亲手建造200亩农场!...
  3. 上线。我都惊呆了。。。
  4. Linux环境:NFS--网络文件系统部署
  5. Linux C++多线程同步的四种方式
  6. 会议容易中吗_运放电路设计中容易出现的细节问题,你都搞懂了吗?
  7. js数组往队头添加数据、js数组从队头移出数据
  8. TypeScript学习(三):联合类型及推论
  9. 那些年的UC人力外包扯淡
  10. 浅析:提升手机APP开发和运营成效的经验分享
  11. 考场自动安排工具开发手记
  12. BZOJ4072[Wf2014] baggage
  13. Unity 防止数组索引越界的几种方法
  14. 项目管理(一) - RFP、合同与SOW的内容与区别
  15. 基于MATLAB的人民币识别系统
  16. bsdiff算法c语言实现,iOS 使用bsdiff进行资源文件增量更新(bsdiff / bspatch)
  17. 什么是云存储,是怎么服务大家的,云存储有什么优点和缺点?
  18. 歌曲:我愿爱(tvb台庆剧插曲)
  19. Python小白的自学笔记第四天
  20. 网页中如何将文字和图片垂直居中

热门文章

  1. linux sudo 必须属于用户ID0,sudo:/usr/bin/sudo 务必属于用户 ID 0(的用户)并且设置 setuid 位...
  2. 7-6 列出连通集 (25 分)(详解)
  3. 卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!
  4. moore 数据集_警报数据集(alarm dataset)_机器学习_科研数据集
  5. [Redis6]key键操作
  6. ios::sync_with_stdio(false)的作用
  7. 有序序列中的i个最大数(算法导论思考题9-1)
  8. JAVA两类比较器的区别(Comparable,Comparator)
  9. Cef mysql.exe_CEF3.2623使用记录:windows编译
  10. PHP数组加表格_php数组输出html表格的操作方法