CF1697C
C. awoo's Favorite Problem
首先,检查两个字符串中所有字母的计数是否相同。
然后考虑下面的重述。字符串s中的字母 b是静止的。而字母a和c则在字符串中移动。第一种移动是将字母a向右移动。第二种类型的移动将字母c向左移动。
请注意,字母 a和c永远不能互换。因此,如果从两个字符串中移除所有字母 b,剩余的字符串应该是相同的。
例如:
s = bcaabababc
t = cbbababaac
去除字符b后:
s = caaaac
t = caaaac
同样,由于字母a和c永远不会互换,因此可以推断出互换后这两个字母各自的位置。s中的第一个字母a应该位于t中的第一个字母a的位置,以此类推。
然后,我们回顾一下,a只能向右移动,而c只能向左移动。因此,我们要检查 s中a的i次出现的位置是否在t中a的i次出现的位置的左边,或者s中c的i次出现的位置是否在 t中c的i次出现的位置的右边,
例如:
s 中 a 的位置为3,4,6,8; c 的位置为2,10.
t 中 a 的位置为4,6,8,9; c 的位置为1,10.
但是有没有可能存在一种反例使上述都成立但是却不符合题目要求?
例如:s 中某一段为...abbbb..., t中与之对应的为...bbbbxa..., x为a或c, 若x为a,则s中该段的字符a所对应的字符为x,与原假设矛盾。反之,如果x为c,则s中a的左边必定存在一个c与之对应,但是又因为s中c的i次出现的位置在t中c的i次出现的位置的右边,故与之矛盾,不存在反例。
总体复杂度:每个测试案例 O(n)。
代码(jls):
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll N=2e5+10;
ll t;
string s1,s2;
ll n;
void solve()
{
cin>>n;
cin>>s1>>s2;
for(auto s:{'a','b','c'})
{
if(std::count(s1.begin(),s1.end(),s)!=std::count(s2.begin(),s2.end(),s))
{
cout<<"NO"<<endl;
return;
}
}
string a="",b="";
vector<ll> k1,k2;
for(int i=0;i<n;++i)
{
if(s1[i]!='b')
{
a+=s1[i];
k1.push_back(i);
}
}
for(int i=0;i<n;++i)
{
if(s2[i]!='b')
{
b+=s2[i];
k2.push_back(i);
}
}
//cout<<a<<endl<<b<<endl;
if(a!=b){
cout<<"NO"<<endl;
return;
}
for(int i=0;i<k1.size();++i)
{
if(a[i]=='a'&&k1[i]>k2[i])
{
cout<<"NO"<<endl;
return;
}
if(b[i]=='c'&&k1[i]<k2[i])
{
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
}
int main()
{
cin>>t;
while(t--)
solve();
return 0;
}
随机推荐
- resttemplate调用
Map<String, Object> queryForHttp(String url, Map<String, Object> header, Map<String, ...
- 基于防火墙的SSLVPN
SCVPN即SSLVPN 拓补图 记得打开策略! 设置外接口(一些管理方式要打开) 设置SSL 地址池(如没要求设iP,随意设) 建立SSL VPN 出接口,地址池要选对 创建一个本地用户(账号A 密 ...
- 国芯新作 | 四核Cortex-A53@1.4GHz,仅168元起?含税?哇!!!
获取更多T507全国产平台资料可在评论区留言或关注官方公众号~
- AT_abc318_g 题解
因为是图上路径是否经过某个点的问题,所以考虑建出圆方树,然后根据圆方树的性质,\(a\) 到 \(c\) 存在经过 \(b\) 的路径等价于 \(a,c\) 在圆方树上的路径经过 \(b\) 或者 \ ...
- MySQL索引种类
normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique full textl: 表示 全文搜索的索引. FULL ...
- 【原创软件】第2期:CAD文字快速批量替换工具CFR(CAD_FastReplace_V4)
01 背景 由于工作需要,开发了一套CAD文字快速批量替换软件CFR.主要目的是:实现dwg文件一次性完成单对/多对词组快速批量替换. 02 主要功能特色 (1)无需打开CAD,快速实现文字批量替换. ...
- 24 年 “年薪百万” 的 Java 程序员,都要学什么?
大家好,我是程序员鱼皮.前几天我看了一篇由国外的 Java 架构师大佬分享的文章,主题是 "Java 架构师必会的 20 个技术". 光看这个标题,就知道在国外做 Java 开发, ...
- NodeJS中Buffer与字符串相互转换时一个值得注意的问题
什么问题 如果一个Buffer的 toString() 结果为乱码或含有乱码,那么用此字符串以 Buffer.from()方法构造出来的Buffer将与原来的Buffer不相同. 这一点其实很好理解, ...
- [oeasy]python0007-调试程序_debug
调试程序 回忆上次内容 py 的程序是按照顺序执行的 是一行行挨排解释执行的 程序并不是数量越多越好 kpi也在不断演化 编辑 写的代码越多 出现的bug就越多 什么是bug 如何找bu ...
- Day 11 - 模拟考
WTP 的大洗牌 题目描述 \(\text{input1}\) 3 1 1 1 1 2 3 \(\text{output1}\) 10 0 数据范围 shuffle.zip 第一题 题目描述 输入格式 ...