Codeforces-1697 C: awoo‘s Favorite Problem 【构造、双指针】
Codeforces-1697 C: awoo’s Favorite Problem
题目传送门:Codeforces-1697 C
题目
题目截图
样例描述
题目大意
给定两个长度为 n n n 的字符串 s s s 和 t t t。每个字符串中包含三种字符:a、b、c。
现在可以做两种操作:将 s s s 字符串中的 “ab” 换成 “ba”;将 s s s 字符串中的 “bc” 换成 “cb”。问能否经过任意数量的这两种操作,将 s s s 转换为 t t t。
题目解析
首先,两个字符串里的各种字符对应的数量应该是一样的。
之后我们考虑给出的两个移动方式,这个题是将交换移动变成了单向交换,若是 a 与 b 可以互换,b 与 c 可以交换,那么我们很容易可以看出,这种方案就相当于 b 可以在字符串中自由移动。这种情况下,只需要检查 s s s、 t t t 中把 b 去掉后 a、c 出现的顺序是否一致即可。
现在我们加入了 b 移动的方向,即只能从 a 右边移动到 a 的左边,只能从 c 左边移动到 c 右边。这也是一种移动, a、c 不会被交换,因此第二段的结论不变。这里可能要有种动态规划的直觉,我们假设第 i i i 个非 b 字符前的位置都已经匹配好了,即 s 1 ⋯ i = t 1 ⋯ i s_{1\cdots i}=t_{1\cdots i} s1⋯i=t1⋯i。 实际上我们此时只要考虑下一个非 b 字符能否调整周围可以调整的 b 来匹配 t t t 即可,这个是可以暴力模拟出来的。
题解给了另一种醒目的做法:对于 s s s 中下一个非 b 字符位置 j j j,我们要匹配 t t t 中对应的位置 k k k。若这个字符为 a,那么 s s s 右边要有充足的字符去调整 a 的位置,且这个位置只能向右,此时若 j > k j > k j>k,那么无论怎么调整,两个字符都无法匹配到,同理,若这个字符是 c,那么 j < k j < k j<k 时,从左边移动 b 到右边永远也不能起到作用。实际上,我们只需要这样简单的判断一下,而不用担心有没有那么多 b 能够移动,因为如果 a 的右边没有我们需要的那么多 b,后面的 c 经过判断时会把这个问题暴露出来。
将操作理解为 a、c 的移动也是不错的选择。
Code
#include <bits/stdc++.h>
using namespace std;int main() {int T, n; string s, t;cin >> T;while(T--) {cin >> n >> s >> t;map<char, int> M;for(int i=0; i<n; ++i) ++M[s[i]], --M[t[i]];bool fl = false;for(auto& m : M) if(m.second != 0) {cout << "NO" << endl; fl = true; break;}if(!fl) {for(int l=0, r=0; l<n; ++l, ++r) {while(s[l] == 'b') ++l;while(r<n && s[l] != t[r]) {if(t[r] != 'b') {fl = true;l=n; break;}++r;}if(l == n) break;if(s[l] == 'a' && l > r) fl=true, l=n;if(s[l] == 'c' && l < r) fl=true, l=n;}if(fl) cout << "NO" << endl;else cout << "YES" << endl;}}return 0;
}
Codeforces-1697 C: awoo‘s Favorite Problem 【构造、双指针】相关推荐
- Codeforces 798C:Mike and gcd problem
Codeforces 798C:Mike and gcd problem 题目链接:http://codeforces.com/contest/798/problem/C 题目大意:给出一个大小为$n ...
- Codeforces - Ehab and a component choosing problem
题目链接:Codeforces - Ehab and a component choosing problem 显然 Σa / k,相当于取平均值,我们得到最大值肯定是k=1的时候. 求最大值树形dp ...
- CodeForces - 1174D Ehab and the Expected XOR Problem(构造+思维+位运算)
题目链接:点击查看 题目大意:给出一个 n,再给出一个 x,要求构造一个数列,满足该数列的所有子串的异或和都不等于 0 且都不等于 x,在满足上面的条件下尽可能长 题目分析:因为这个题目最终的目标是需 ...
- Codeforces Round #446 (Div. 1) B. Gluttony 构造 + 补集思想
传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,保证aaa中每个数都互不相同,让你构造一个数组bbb,满足对于任意的S=x1,x2,...,xk,1≤xi≤n,0≤k<nS={x_ ...
- Codeforces Round #592 (Div. 2) F. Chips 构造 + 细节
传送门 文章目录 题意: 思路: 题意: 思路: 恶心的构造题,思路很简单但是代码细节很多,搞了半天. 根据题目的性质不难发现,如果有两个相同颜色的球相邻,那么他们的颜色永远不会改变. 根据这个性质, ...
- Codeforces - 814B - An express train to reveries - 构造
http://codeforces.com/problemset/problem/814/B 构造题烦死人,一开始我还记录一大堆信息来构造p数列,其实因为s数列只有两项相等,也正好缺了一项,那就把两种 ...
- hdu 1757 A Simple Math Problem 构造矩阵
题意:函数f(x), 若 x < 10 f(x) = x. 若 x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + ...
- HDU多校4 - 6813 Last Problem(构造)
题目链接:点击查看 题目大意:给出一个无限大的二维平面,需要在平面内进行染色,每次可以选择一个点 ( x , y ) 将其染色为 n 的前提是,相邻四个格子必须分别已经染了 n - 1 , n - 2 ...
- CodeForces - 1364C Ehab and Prefix MEX(贪心+构造)
题目链接:点击查看 题目大意:给出一个数组 a ,要求构造一个数组 b ,使得 a[ i ] = MEX{ b[ 1 ] , b[ 2 ] , ... b[ i - 1 ] , b[ i ] },a[ ...
最新文章
- 揭秘三维视觉之结构光原理
- 华硕笔记本自带win10改win7的方法
- Windows核心编程 第十八章 堆栈
- VirtualBox虚拟机中Ubuntu11.10安装Additions出现 读写错误的解决办法
- python是外部还是编程_Python网络编程(绑定到外部地址)
- 【最佳解法】剑指 Offer 32 - III. 从上到下打印二叉树 III
- 一个顾客买了价值x元的商品(C语言)
- 联发科发布天玑9000移动平台 4nm制程 Armv9架构
- top -bcn -1
- css中的.clearfix是什么意思?
- 申作军海通机器人_青岛海通机器人系统有限公司
- 【水果识别】基于matlab GUI形态学水果识别(含识别率)【含Matlab源码 907期】
- java数字转中文_java阿拉伯数字转中文数字
- 土豆服务器延期修复,Uplay更新失败解决方法 教你对付土豆服务器!
- 验证码自动识别平台与打码平台的区别
- vue3生成二维码打印
- 开方 质数_如何心算大数的高次开方(个人观点)
- dataframe 离群值处理
- Fabric v2.3 下载二进制文件和镜像bootstrap.sh脚本解析
- HTML实训实训心得
热门文章
- 跨境早报| 2020美国电商高退货率品类有哪些?速卖通发布重要物流通知!
- 复盘会如何开出新花样?10种方式让你开出让人惊喜的复盘会【附复盘问题列表】
- 8086到80486的编号时代终结,第一次跻身财富500强和486阉割版处理器
- 苹果地图设置途经点_如何设置苹果地图以避免通行费和高速公路
- win7清空回收站的资料寻回办法
- 深度学习log-链路追踪-Spring Cloud Sleuth and ZipKin
- 什么是对象(object)
- python 多张图片进行横向与纵向的无损拼接,适用于图片宽高差不多的图片
- 纵向输出字符串python_python字符串(转义字符)_1.05
- 服务器响应200,但是没有返回,且后端没有收到请求的可能性,是 “/“ 的缺失 , 关于vue走代理遇到的坑,细节问题