题目给出的条件:

A->BC

B->AC

C->AB

我们可以通过推理获得三个式子:

A->BB

B<->AB(这意味着B之前可以增加或者减少任意个A)

B<->C(可以把所有的C看成B,因为它们能互相转化)

证明如下:

1.首先有B->AC->AAB   所以B->AAB->AAAAB->AB->AAAB->B

故B<->AB

2.由于B->AAB->AAAC->C

并且C->AB->AAAB->B

故C<->B

3.由证明2,A->BC->BB

那么,问题转化为:能不能从一个只有A和B的序列S-sub,转化到另一个只有A和B的序列T-sub。

1.观察我们证明得到的式子,可以发现我们不能凭空在B后面生成后缀A。

所以,T-sub可以从S-sub 转化来的必要条件是T-sub的后缀A数量大于S-sub的后缀A.

2.由于三个连续的A是可以消除的,所以消除S后缀中多余的A,使得S的后缀A数量恰好不小于T的后缀A数量。(即再消去三个连续的A会导致S的后缀A数量小于T的后缀A数量)

3.再观察式子,发现B可以凭空成双产生(B->AB->BBB),但是不能凭空消失。所以序列T-sub的B数量不得少于S-sub中B的数量。(注意,如果S-sub的后缀A删除了一部分后仍然多于T-sub的后缀A,那么一定要把S-sub中第一个多的A变为BB,此时S-sub中B的数量应该+2考虑,比如S-sub是AAAA,T-sub是BBAA时,S-sub变为ABBAA)

又由于B是成双产生的,所以T-sub和S-sub中的B数量差值是个偶数,否则无法转化。

4.另外,凭空产生B的条件是当S-sub删除一定的末尾A之后不是空串(如果是空串那么无法产生B)

当以上4个条件满足时候,可以从S-sub串转变成T-sub串。具体实现细节参考代码。

#include<bits/stdc++.h>
using namespace std;
char S[100000 + 5], T[100000 + 5];
int Sa[100000 + 5], Sb[100000 + 5], Ta[100000 + 5], Tb[100000 + 5], tailS[100000 + 5], tailT[100000 + 5];
int Q, a, b, c, d;//B可以凭空成双产生
int main()
{//freopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);scanf("%s%s", S + 1, T + 1);int lenS = strlen(S + 1);int lenT = strlen(T + 1);scanf("%d", &Q);for (int i = 1; i <= lenS; i++) {Sa[i] = Sa[i - 1] + (S[i] == 'A');Sb[i] = Sb[i - 1] + (S[i] != 'A');if (S[i] == 'A')tailS[i] = tailS[i - 1] + 1;else tailS[i] = 0;}for (int i = 1; i <= lenT; i++) {Ta[i] = Ta[i - 1] + (T[i] == 'A');Tb[i] = Tb[i - 1] + (T[i] != 'A');if (T[i] == 'A')tailT[i] = tailT[i - 1] + 1;else tailT[i] = 0;}for (int i = 0; i < Q; i++) {scanf("%d%d%d%d", &a, &b, &c, &d);int ans = 1;int diffb = Tb[d] - Tb[c - 1] - Sb[b] + Sb[a - 1];int tS = min(b - a + 1, tailS[b]);int tT = min(d - c + 1, tailT[d]);if (diffb < 0 || tT - tS>0 || diffb % 2 == 1)ans = 0;int remain = (tS - tT) % 3 > 0;if (diffb - remain * 2 < 0)ans = 0;if (Sb[b] - Sb[a - 1] == 0 && diffb&&tS == tT)ans = 0;printf("%d", ans);}
}

cf923D Picking Strings相关推荐

  1. CF923D Picking Strings

    一.题目 点此看题 二.解法 智商题,像我这种蒟蒻怎么想得出来-

  2. [CF923D]Picking Strings

    题目 传送门 to CF 题意概要 对于一个字符串,你可以进行任意次操作,每次选中一个子串,应用如下变换规则: 如果该子串为 AAA ,将其用 BCBCBC 替换. B→ACB\rightarrow ...

  3. 【CodeForces】947 D. Picking Strings

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

  4. cf 923D Picking Strings

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

  5. codeforces E. Picking Strings 构造

    题目链接 Picking String 题意 给出字符串S和T,1e5个询问,每次询问S的一段区间是否能转变成T的一段区间. 转变方式: A>BCA>BCA>BC B>ACB& ...

  6. 短语loosen the purse strings

    短语loosen the purse strings的意思是慷慨解囊. 例句: 1. Ford's chief financial officer, Lewis Booth, said there w ...

  7. Android TextView 在strings 里面 实现换行

    在TextView 把text 使用快捷键放到strings 里面 \n是无法被放到里面的 如果想实现换行 可以手动在里面添加 \n 例如写了一个小例子, 如果你写了多语言适配 ,那么在你的其他的st ...

  8. Go 学习笔记(51)— Go 标准库之 strings(字符串比较、字符串前后缀、字符串统计、字符串索引、字符串包含、字符串转换、字符串复制、字符串替换、字符串去除、字符串分割和连接)

    1. 概述说明 import "strings" strings 包实现了用于操作字符的简单函数. strings 包与 bytes 包中的函数用法基本一样. 2. 主要函数 2. ...

  9. Simple Dynamic Strings(SDS)源码解析和使用说明二

    在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...

最新文章

  1. 修改代码150万行!Apache Flink 1.9.0做了这些重大修改!(附链接)
  2. 集群节点Elasticsearch升级
  3. 利用shell脚本来监控linux系统的内存
  4. 【Flask】Flask-RESTful 风格编程
  5. 超越ImageNet预训练,Meta AI提出SplitMask,小数据集也能自监督预训练
  6. 断开式绑定数据在comboBox中 winform
  7. php软件开发--html进阶
  8. mysql 常用管理命令
  9. 第10题 正则表达式匹配(动态规划)
  10. MySQL - SELECT LAST_INSERT_ID() 使用总结
  11. 淘宝评论API接口,item_review-获得淘宝商品评论API接口接入说明
  12. 思维导图软件Mindmanager2018下载
  13. IllegalArgumentException :argument type mismatch
  14. 人生感悟:影响人成功和幸福的21点
  15. 京东2020双十二活动终于来啦,脚本助你领年终
  16. 小米怎么快速回到顶部_灵巧精干的出游神器 小米对讲机Lite上手体验
  17. Docker系列之三:使用Docker镜像和仓库
  18. 驭势吴甘沙:我的根本利益|Xtecher人物特稿
  19. mac python环境搭建
  20. Android N分屏(多窗口)适配

热门文章

  1. 数据库学习:高并发数据库设计
  2. 隐马尔科夫模型(HMMs)之二:隐含模式
  3. python-opencv保存图片
  4. 如何搭建自己的gitlab服务
  5. 和kswapd0挖矿病毒做斗争的一天
  6. UE特效案例 —— 武器附魔
  7. ROOT【个人学习,慎用】
  8. 2018年作为程序员的我跑去开淘宝了,然后就随意总结了下
  9. 基于AidLux+YOLOv5s-DA的路面缺陷检测系统
  10. 若申请调剂,第一志愿自动放弃?