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;
}
随机推荐
- 技嘉BIOS超频设置操作路径
关闭超线程 频率电压控制 > 进阶处理器设置 > Hyper_THreading 关小核心 频率电压控制 > GIGABYTE PerfDrive > Ecore Disabl ...
- GIS数据获取:气象数据免费下载网站
本文对目前主要的气象数据获取网站加以整理与介绍. 本文为"GIS数据获取整理"专栏中第二篇独立博客,因此本文全部标题均由"2"开头.本文对目前主要的气象 ...
- Markdown常用语法详解
背景知识 什么是html html是一种网页标记语言.我们平常见到的那么好看的网页就是通过html语言来编写的. html语言举例: <h1>hello world</h1> ...
- 防止unordered_map 被卡方法
codeforces 上看到的,mark 一下代码.原作者:neal,原链接:https://codeforces.com/blog/entry/62393 struct custom_hash { ...
- centos如何统计磁盘使用总量,以及cpu使用率
剩余硬盘容量 T: df | awk '{print $4}' |sed 's/Available//g' |sed '/^\s*$/d' | awk '{sum+=$1} END {print su ...
- 在C#中使用RabbitMQ做个简单的发送邮件小项目
在C#中使用RabbitMQ做个简单的发送邮件小项目 前言 好久没有做项目了,这次做一个发送邮件的小项目.发邮件是一个比较耗时的操作,之前在我的个人博客里面回复评论和友链申请是会通过发送邮件来通知对方 ...
- 全新 UI 震撼来袭!ng-matero v18 正式发布!
前言 断断续续折腾了近两周,ng-matero v18 终于发布了.其中最大的亮点是启用 Material 3 主题以及全新的 UI 设计.特别说明,这是 ng-matero 发布五年以来首次 UI ...
- Redis 注册成windows 服务并开机自启动
进入安装目录 输入命令redis-server --service-install redis.windows.conf 输入启动命令即可 redis-server --service-start ...
- leetcode中等(字符串):[3, 6, 8, 49, 179, 299, 524, 539, 609, 648]
目录 3. 无重复字符的最长子串 6. Z 字形变换 8. 字符串转换整数 (atoi) 49. 字母异位词分组 179. 最大数 299. 猜数字游戏 524. 通过删除字母匹配到字典里最长单词 5 ...
- vscode element-plus/lib/theme-chalk/index.css报错路径找不到
vscode element-plus/lib/theme-chalk/index.css报错路径找不到 import { createApp } from 'vue' import './styl ...