Where there's |

M_CI

园龄:16天粉丝:0关注:0

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!!!

本文作者:M_CI

本文链接:https://www.cnblogs.com/M-CI/p/18751420

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   M_CI  阅读(2)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起