[AGC055B] ABC Supremacy 题解
1.P5192 Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流2.Phi的反函数3.魔力屏障 (magic) 题解4.CF338D GCD Table 题解
5.[AGC055B] ABC Supremacy 题解
6.[AGC055A] ABC Identity 题解7.QOJ 6504. CCPC Final 2022 D Flower's Land 2题解8.[SDOI2010] 代码拍卖会 题解9.PERIODNI - Periodni 题解 & 笛卡尔树讲解 & 树状背包讲解10.Burnside 定理11.ZS Shuffles Cards 题解[AGC055B] ABC Supremacy 题解
题目描述
给定两个长度为
你可以进行若干次以下操作:
- 若
中的一个子串为ABC
,BCA
或CAB
,那么可以将这个子串替换为ABC
,BCA
或CAB
。
求能否将 YES
或 NO
。
解析
不难发现,我们可以根据一些变换将ABC
,BCA
或 CAB
和单个字母 A
换位置。
具体操作如下:
BCA
CAB
都可以转换成ABC
我们可以把字符串 ABC
,BCA
或 CAB
移动到最前面,剩余部分如果一样就可以转换。
实现
我们不需要真的把所有的 ABC
,BCA
或 CAB
移动到最前面,只需要将他们删除,再比对剩余串。
用 vector
实现比较方便。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
char ck[4][4]={{'0','0','0'},
{'A','B','C'},
{'B','C','A'},
{'C','A','B'}
};
int n,na,nb;
char a[N],b[N];
vector<char>q;
bool pd(int x){
for(int i = 1; i <= 3; ++i){
if(q[x] == ck[i][0] && q[x + 1] == ck[i][1] && q[x + 2] == ck[i][2]){
return 1;
}
}
return 0;
}
void op(char x[],int &nx){
q = vector<char>();
for(int i = 0; i < n; ++i){
q.push_back(x[i]);
while(q.size() >= 3 && pd(q.size() - 3)){
q.pop_back();q.pop_back();q.pop_back();
}
}
nx = q.size();
for(int i = 0;i < q.size(); ++i){
x[i] = q[i];
}
}
void output(){
if(na != nb){
cout<<"NO"<<'\n';
return ;
}
for(int i = 0;i < na; ++i){
if(a[i] != b[i]){
cout<<"NO"<<'\n';
return ;
}
}
cout<<"YES"<<'\n';
}
int main(){
cin>>n>>a>>b;
op(a,na);op(b,nb);
output();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!