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. 卷积神经网络中nn.Conv2d()和nn.MaxPool2d()以及卷积神经网络实现minist数据集分类

    卷积神经网络中nn.Conv2d()和nn.MaxPool2d() 卷积神经网络之Pythorch实现: nn.Conv2d()就是PyTorch中的卷积模块 参数列表 参数 作用 in_channe ...

  2. Salt安装部署

    Salt安装部署 一:salt简介 ​ 早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护.系统管理员面临的问题主要是1.系统配置管理,2.远程执行命令,因此诞生了 ...

  3. html2canvas 页面截屏

    $(document).ready(function () { $(".example1").on("click", function (event) { va ...

  4. Spark3学习【基于Java】1. Spark-Sql入门程序

    spark-sql是用来处理结构化数据的模块,是入门spark的首要模块. 技术的学习无非就是去了解它的API,但是Spark有点难,因为它的例子和网上能搜到的基本都是Scala写的.我们这里使用Ja ...

  5. Java 表达式执行引擎 jexl

    介绍 JEXL的全称是Java表达式语言(Java Expression Language),简单的说,它可以配合我们的Java程序运算一些简单的表达式. 具体可以识别哪些表达式? 包含最基本的加减乘 ...

  6. Python生成PDF:Reportlab的六种使用方式

    Reportlab是Python创建PDF文档的功能库 这里是整理过的六种Reportlab使用方式,主要参考的是<ReportLab User Guide> 一.使用文档模板DocTem ...

  7. [oeasy]python0106 七段数码管_显示字母_BP机

    七位数码管进化 回忆上次内容 上次回顾了 7-seg 七位数码管 可以显示数字 甚至是十六进制数字   ​   添加图片注释,不超过 140 字(可选)   能否让 七位数码管 将26个字母 全部都显 ...

  8. SQL Server AdventureWorks示例数据库

    SQL Server AdventureWorks2008R2 数据字典 AdventureWorks2008R2示例数据库下载 AdventureWorks2008R2数据字典(官网) Addres ...

  9. 垃圾回收器比较:CMS 和 G1

    前言 在查看系统内存监控的过程中,发现有几台机器的内存使用率一直很高,而且是呈现一个不太正常的高度,初始以为是 GC 不完全,也就是 JVM 内有大量对象不能回收,于是采用 Arthas 诊断查看一下 ...

  10. 记一次springboot整合rabbitMQ的list序列化问题

    问题:平时传一个类的时候都会继承Serializable实现正确传输,这次我把list<Object>直接丢成了message,导致rabbitMQ不能序列化对象.报错 org.sprin ...