AT_agc055_b [AGC055B] ABC Supremacy 蓝 题解
1.AT_agc015_c [AGC015C] Nuske vs Phantom Thnook 绿 题解2.AT_joisc2019_k 合併 (Mergers) 蓝 题解
3.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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步