AT_agc055_b [AGC055B] ABC Supremacy 蓝 题解
前言
今天联考 T2 是这道,又成唐氏了,巨简单题又没想出正解。
思路
由题面,我们知道本题中字符串的每一个长成 \(\texttt{ABC}, \texttt{BCA}\) 或 \(\texttt{CAB}\) 其一的子串都是可以换成另两个其一。
先给大家看三个小转换:
\(\texttt{AABC} \rightarrow \texttt{ABCA}\)
\(\texttt{BABC} \rightarrow \texttt{BCAB} \rightarrow \texttt{ABCB}\)
\(\texttt{CABC} \rightarrow \texttt{ABCC}\)
发现了什么?
没错,我们可以用题面中的转换方式将任何形如 \(\texttt{XABC}\) 的串转换为 \(\texttt{ABCX}\) 的形式。
这时,我们的脑海里自然的出现一个思路:我们尽量多的把 \(\texttt{ABC}\)“推”到 \(S\) 和 \(T\) 的前面,比较推完后的串是否相等就可以了。
(注:上文中的 \(\texttt{ABC}\) 均可用 \(\texttt{BCA}\) 或 \(\texttt{CAB}\) 代替,因为我们可以通过一次交换将 \(\texttt{BCA}\) 或 \(\texttt{CAB}\) 换为 \(\texttt{ABC}\),这显然是等价的。)
代码
#include <bits/stdc++.h>
using namespace std;
namespace rab {
const string d[3]={"ABC","BCA","CAB"};
int n,k;
string s,t,p,q,g;
void init () {
for (int i=0;i<n;i++) {
p+=s[i];
if (p.size ()>=3) {
g=p.substr (p.size ()-3,3);
for (int j=0;j<3;j++)
if (g==d[j]) {
p.pop_back ();
p.pop_back ();
p.pop_back ();
break;
}
}
}
}
void solve () {
cin>> t;
q.clear ();
for (int i=0;i<n;i++) {
q+=t[i];
if (q.size ()>=3) {
g=q.substr (q.size ()-3,3);
for (int j=0;j<3;j++)
if (g==d[j]) {
q.pop_back ();
q.pop_back ();
q.pop_back ();
break;
}
}
}
if (p==q) cout<< "YES\n";
else cout<< "NO\n";
return ;
}
int main () {
cin>> n>> s;
k=1;
init ();
while (k--) solve ();
return 0;
}
}
signed main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
return rab::main ();
}
后言
为什么联考最容易拿分的总是不是 T1!!!

浙公网安备 33010602011771号