AGC055B
可爱洛谷 AtCoder Remote Judge 寄了,难绷。
你注意到这个操作是可逆的,那你就把这两个串按照一个规则转化成另一个串,比较这两个串一不一样就行。
然后你手玩一下,形如 ?ABC 的子串都能变成 ABC?。
那这样所有的 ABC 都可以被移到最前面,然后因为题目里的另外两个字符串也能转换成 ABC,我们一起把他扔到前面。
然后你判断一下这两个一不一样就行。
有一个好写的做法是,我们从前往后跑一下,每次往新字符串后面加一个字符,如果最后三个字符是可以变化的字符串,那就删掉最后三个。
#include<bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for(auto i = (l); i <= (r); ++i)
#define _rep(i, l, r) for(auto i = (l); i < (r); ++i)
#define pb push_back
#define fi first
#define se second
#define i64 long long
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; string s, t;
cin >> n >> s >> t;
string S, T;
_rep (i, 0, s.size()) {
S += s[i], T += t[i];
if (S.size() >= 3) {
string tmp = "$$$";
tmp[0] = S[S.size() - 3];
tmp[1] = S[S.size() - 2];
tmp[2] = S[S.size() - 1];
if (tmp == "ABC" || tmp == "BCA" || tmp == "CAB") {
S.pop_back();
S.pop_back();
S.pop_back();
}
}
if (T.size() >= 3) {
string tmp = "$$$";
tmp[0] = T[T.size() - 3];
tmp[1] = T[T.size() - 2];
tmp[2] = T[T.size() - 1];
if (tmp == "ABC" || tmp == "BCA" || tmp == "CAB") {
T.pop_back();
T.pop_back();
T.pop_back();
}
}
}
if (S == T) cout << "YES\n";
else cout << "NO\n";
return ~~(0 ^ 0);
}