Loading

【题解】AGC055B - ABC Supremacy

给定初始串,每次可以将一个当前串的一个子串 "ABC"、"BCA"、"CAB",变成 "ABC"、"BCA"、"CAB",问是否能变成最终串。

由于我们需要计算的是可行性,而不需要最小化次数。同时考虑到操作是可逆的,所以如果 \(S\to T\)\(S\to X\)\(T\to X\) 。同理,如果 \(S\to X\)\(T\to X\) ,则 \(S\to T\)

所以我们考虑是否存在一个串 \(X\)。这个串同时需要有辨识度。

回到主线,如果原串能进行操作,当且仅当存在 "ABC"、"BCA"、"CAB"。我们先将这些全部变成 "ABC"。

然后不难发现无论 "ABC" 前面是什么字符,都有 "?ABC" \(\to\) "ABC?"。所以我们每次将 "ABC" 移到最前面即可,用栈维护。

#define N 500005
int n, top;char s[N], t[N], u[N], v[N], sta[N];
inline bool ck(){
	if(sta[top - 2] == 'A' && sta[top - 1] == 'B' && sta[top] == 'C')return true;
	if(sta[top - 2] == 'B' && sta[top - 1] == 'C' && sta[top] == 'A')return true;
	if(sta[top - 2] == 'C' && sta[top - 1] == 'A' && sta[top] == 'B')return true;
	return false;
}
void calc(char *a, char *b){
	top = 0;
	rep(i, 1, n){
		sta[++top] = a[i];
		if(top > 2 && ck())top -= 3;
	}
	rep(i, 1, top)b[i] = sta[i];
}
int main() {
	//int T = read();while(T--)solve();
	n = read();
	scanf("%s%s", s + 1, t + 1);
	calc(s, u), calc(t, v);
	rep(i, 1, n)if(u[i] != v[i]){puts("NO");return 0;}
	puts("YES");
	return 0;
}
posted @ 2021-11-07 16:30  7KByte  阅读(109)  评论(0)    收藏  举报