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;
}

随机推荐

  1. .Net8 AddKeyedScoped键值key注册服务异常

    异常描述:This service descriptor is keyed. Your service provider may not support keyed services. 场景:.Net ...

  2. Masonry在视图相对关系处理中的各种“offset”

    如果我们需要设置一个view在另一个view的右边缘距离一定距离的地方,利用Masonry这么写: [a mas_makeConstraints:^(MASConstraintMaker *make) ...

  3. Android程序获取鸿蒙手机设备信息(是否鸿蒙手机、版本号、小版本号等)

    1.效果图 鸿蒙手机 --> 关于手机的截图: Android程序获取鸿蒙手机设备信息的截图: 2.实现 本案例DEMO的实现主要借鉴了网上现有的资料: https://blog.csdn.ne ...

  4. golang执行命令 && 实时获取输出结果

    背景 golang可以获取命令执行的输出结果,但要执行完才能够获取. 如果执行的命令是ssh,我们要实时获取,并执行相应的操作呢? 示例 func main() { user := "roo ...

  5. python提取特定格式的数据

    Excel Grid Data Converter 知识点总结 本文档总结了 ExcelGridConverter.py 脚本所涉及的关键 Python 知识点.该脚本用于从多个 Excel 文件中提 ...

  6. 基于Python和TensorFlow实现BERT模型应用

    本文分享自华为云社区<使用Python实现深度学习模型:BERT模型教程>,作者: Echo_Wish. BERT(Bidirectional Encoder Representation ...

  7. 3款C#开源且实用的工具类库,工作效率提升利器!

    前言 在日常工作开发中工具类库是软件开发中不可或缺的一部分,它们通过提供代码重用.通用功能.隐藏复杂性.提高代码质量.扩展性等方面的优势,帮助开发者更高效.更稳定地构建软件应用程序.今天大姚给大家分享 ...

  8. C#开发单实例应用程序并响应后续进程启动参数

    C#默认的WinForm模板是不支持设置单实例的,也没有隔壁大哥VB.NET那样有个"生成单个实例应用程序"的勾选选项(VB某些时候要比C#更方便),实现单实例可以有多种方法: 检 ...

  9. Vue 处理异步加载顺序问题:在Konva中确保文本在图片之上显示

    Vue 处理异步加载顺序问题:在Konva中确保文本在Konva之上显示 在使用Konva开发应用时,我们经常会遇到需要将文本绘制在图片之上的情况.一个常见的问题是,由于图像加载是异步的,文本有时会显 ...

  10. koa web框架入门

    1.在hello-koa这个目录下创建一个package.json,这个文件描述了我们的hello-koa工程会用到哪些包.完整的文件内容如下: { "name": "h ...