cf923D Picking Strings
题目给出的条件:
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相关推荐
- CF923D Picking Strings
一.题目 点此看题 二.解法 智商题,像我这种蒟蒻怎么想得出来-
- [CF923D]Picking Strings
题目 传送门 to CF 题意概要 对于一个字符串,你可以进行任意次操作,每次选中一个子串,应用如下变换规则: 如果该子串为 AAA ,将其用 BCBCBC 替换. B→ACB\rightarrow ...
- 【CodeForces】947 D. Picking Strings
[题目]D. Picking Strings [题意]给定只含'A','B','C'的字符串,支持以下变换:1.A - BC 2.B - AC 3.C - AB 4.AAA - empty ...
- cf 923D Picking Strings
一 原题 E. Picking Strings time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- codeforces E. Picking Strings 构造
题目链接 Picking String 题意 给出字符串S和T,1e5个询问,每次询问S的一段区间是否能转变成T的一段区间. 转变方式: A>BCA>BCA>BC B>ACB& ...
- 短语loosen the purse strings
短语loosen the purse strings的意思是慷慨解囊. 例句: 1. Ford's chief financial officer, Lewis Booth, said there w ...
- Android TextView 在strings 里面 实现换行
在TextView 把text 使用快捷键放到strings 里面 \n是无法被放到里面的 如果想实现换行 可以手动在里面添加 \n 例如写了一个小例子, 如果你写了多语言适配 ,那么在你的其他的st ...
- Go 学习笔记(51)— Go 标准库之 strings(字符串比较、字符串前后缀、字符串统计、字符串索引、字符串包含、字符串转换、字符串复制、字符串替换、字符串去除、字符串分割和连接)
1. 概述说明 import "strings" strings 包实现了用于操作字符的简单函数. strings 包与 bytes 包中的函数用法基本一样. 2. 主要函数 2. ...
- Simple Dynamic Strings(SDS)源码解析和使用说明二
在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...
最新文章
- 修改代码150万行!Apache Flink 1.9.0做了这些重大修改!(附链接)
- 集群节点Elasticsearch升级
- 利用shell脚本来监控linux系统的内存
- 【Flask】Flask-RESTful 风格编程
- 超越ImageNet预训练,Meta AI提出SplitMask,小数据集也能自监督预训练
- 断开式绑定数据在comboBox中 winform
- php软件开发--html进阶
- mysql 常用管理命令
- 第10题 正则表达式匹配(动态规划)
- MySQL - SELECT LAST_INSERT_ID() 使用总结
- 淘宝评论API接口,item_review-获得淘宝商品评论API接口接入说明
- 思维导图软件Mindmanager2018下载
- IllegalArgumentException :argument type mismatch
- 人生感悟:影响人成功和幸福的21点
- 京东2020双十二活动终于来啦,脚本助你领年终
- 小米怎么快速回到顶部_灵巧精干的出游神器 小米对讲机Lite上手体验
- Docker系列之三:使用Docker镜像和仓库
- 驭势吴甘沙:我的根本利益|Xtecher人物特稿
- mac python环境搭建
- Android N分屏(多窗口)适配