【题解】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;
}

浙公网安备 33010602011771号