LeBao2023
2024-11-16 17:02:03
原题链接
这道题是一道十分恶心的题,主要是赛时的题目描述看了我很久,十分毒瘤。
简要题意:
给定两个长度为
你可以进行若干次以下操作:若
求能否将
我们容易发现变换可逆。我们可以将
我们看见 ABC 的转换,就可以向 ABC 思考。
设 X 为任意字母,我们发现 ABCX 可以转换成 XABC。
证明如下:
X 为 A,ABCA
X 为 B,ABCB
X 为 C,ABCC
因为变换可逆,所以 XABC 可以转换成 ABCX,ABC 可以在序列里任意移动,同理,BCA 和 CAB 也可以移动,删除也没有问题。
我们可以把
code:
#include<bits/stdc++.h>
using namespace std;
int n;
string bx(string a)
{
stack<int> s;a=" "+a;
for(int i=1;i<=n;i++)
{
s.push(a[i]-'A');
if(s.size()>=3)
{
int u=s.top();s.pop();
int v=s.top();s.pop();
if(s.top()==(u+1)%3&&u==(v+1)%3&&v==(s.top()+1)%3)
{
s.pop();
}
else
{
s.push(v);s.push(u);
}
}
}
for(int i=1;i<=n;i++)
{
a[i]=5;
}
for(int i=s.size();i>=1;i--)
{
a[i]=s.top();s.pop();
}
return a;
}
string s;
int main()
{
cin>>n>>s;
s=bx(s);
int q=1;string a;
while(q--)
{
cin>>a;
a=bx(a);
int flag=0;
for(int i=1;i<=n;i++)
{
if(a[i]!=s[i])
{
flag=1;
break;
}
}
if(flag==1)
{
cout<<"NO\n";
}
else
{
cout<<"YES\n";
}
}
}
时间发杂度: