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);
}