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

posted @ 2025-03-04 20:54  M_CI  阅读(29)  评论(0)    收藏  举报