codeforces E. Picking Strings 构造
题目链接
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 构造相关推荐
- 【CodeForces】947 D. Picking Strings
[题目]D. Picking Strings [题意]给定只含'A','B','C'的字符串,支持以下变换:1.A - BC 2.B - AC 3.C - AB 4.AAA - empty ...
- codeforces 616F Expensive Strings
codeforces 616F Expensive Strings (广义后缀自动机) https://codeforces.com/contest/616/problem/F 题意: 给你n个字符串 ...
- cf 923D Picking Strings
一 原题 E. Picking Strings time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- CodeForces - 287C Lucky Permutation(构造)
题目链接:点击查看 题目大意:构造一个合法的排列,满足 ppi=n−i+1p_{p_{i}}=n-i+1ppi=n−i+1 题目分析:因为第四个样例的存在降低了本题的难度,不然感觉还是有点难度的一 ...
- CodeForces - 468C Hack it!(构造+数位dp)
题目链接:点击查看 题目大意:求出一段区间 [l,r][l,r][l,r] 的数位和对 aaa 取模后为 000.更具体的,设 f(x)f(x)f(x) 为 xxx 的数位和,本题需要求出一对 [l, ...
- CodeForces - 1561E Bottom-Tier Reversals(构造)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的排列,每次操作可以选择一个奇数长度的前缀然后反转,需要构造一种方案,使得在不超过 5n2\frac{5n}{2}25n 次操作后使得序列有序 ...
- CodeForces - 1494E A-Z Graph(构造+思维)
题目链接:https://vjudge.net/problem/CodeForces-1494E 题目大意:给出一个初始时只有 nnn 个点的有向带权图,需要执行 mmm 次操作,每次操作分为下列三种 ...
- CodeForces - 1494D Dogeforces(贪心+构造)
题目链接:点击查看 题目大意:给出 nnn 个叶子结点和一个 n∗nn*nn∗n 的 LCALCALCA 矩阵,其中 LCALCALCA 表示的是最近公共祖先节点的权值,现在需要构造出一棵自顶向下权值 ...
- CodeForces - 148C Terse princess (构造)
题目链接:http://codeforces.com/problemset/problem/148/C点击打开链接 C. Terse princess time limit per test 1 se ...
最新文章
- Oracle根据日期区间查询Date类型的数据
- 有史以来最会写代码的农民诞生!腾讯元老、上市公司CTO赚够钱后辞职!到安徽农村隐居,亲手建造200亩农场!...
- 上线。我都惊呆了。。。
- Linux环境:NFS--网络文件系统部署
- Linux C++多线程同步的四种方式
- 会议容易中吗_运放电路设计中容易出现的细节问题,你都搞懂了吗?
- js数组往队头添加数据、js数组从队头移出数据
- TypeScript学习(三):联合类型及推论
- 那些年的UC人力外包扯淡
- 浅析:提升手机APP开发和运营成效的经验分享
- 考场自动安排工具开发手记
- BZOJ4072[Wf2014] baggage
- Unity 防止数组索引越界的几种方法
- 项目管理(一) - RFP、合同与SOW的内容与区别
- 基于MATLAB的人民币识别系统
- bsdiff算法c语言实现,iOS 使用bsdiff进行资源文件增量更新(bsdiff / bspatch)
- 什么是云存储,是怎么服务大家的,云存储有什么优点和缺点?
- 歌曲:我愿爱(tvb台庆剧插曲)
- Python小白的自学笔记第四天
- 网页中如何将文字和图片垂直居中
热门文章
- linux sudo 必须属于用户ID0,sudo:/usr/bin/sudo 务必属于用户 ID 0(的用户)并且设置 setuid 位...
- 7-6 列出连通集 (25 分)(详解)
- 卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!
- moore 数据集_警报数据集(alarm dataset)_机器学习_科研数据集
- [Redis6]key键操作
- ios::sync_with_stdio(false)的作用
- 有序序列中的i个最大数(算法导论思考题9-1)
- JAVA两类比较器的区别(Comparable,Comparator)
- Cef mysql.exe_CEF3.2623使用记录:windows编译
- PHP数组加表格_php数组输出html表格的操作方法