Problem p02692 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>

#define _overload(_1, _2, _3, name, ...) name
#define _rep(i, n) _range(i, 0, n)
#define _range(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define rep(...) _overload(__VA_ARGS__, _range, _rep, )(__VA_ARGS__)

#define _rrep(i, n) _rrange(i, 0, n)
#define _rrange(i, a, b) for (int i = (int)(b)-1; i >= (int)(a); --i)
#define rrep(...) _overload(__VA_ARGS__, _rrange, _rrep, )(__VA_ARGS__)

#define _all(arg) begin(arg), end(arg)
#define uniq(arg) sort(_all(arg)), (arg).erase(unique(_all(arg)), end(arg))
#define bit(n) (1LL << (n))

#define dbg(x)                                                                 \\
  cerr << #x << " = " << (x) << " (L" << __LINE__ << ") " << __FILE__ << endl;

using namespace std;

// overload: >>, <<
template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  for (auto &v : vec)
    is >> v;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const deque<T> &vec) {
  os << "deq[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const set<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_set<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const multiset<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_multiset<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &pa) {
  os << "(" << pa.first << "," << pa.second << ")";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const unordered_map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}

// overload: +, -, *, /
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first + r.first, l.second + r.second);
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first - r.first, l.second - r.second);
}

// template functions
template <typename T> void ndarray(vector<T> &vec, int len) { vec.resize(len); }
template <typename T, typename... Args>
void ndarray(vector<T> &vec, int len, Args... args) {
  vec.resize(len);
  for (auto &v : vec)
    ndarray(v, args...);
}
template <class T> bool chmax(T &a, const T &b) {
  return (a < b) ? (a = b, 1) : 0;
}
template <class T> bool chmin(T &a, const T &b) {
  return (b < a) ? (a = b, 1) : 0;
}

using ll = long long;
using vi = vector<int>;
using vll = vector<ll>;

const double EPS = 1e-10;
const double PI = acos(-1.0);
const int inf = INT_MAX;
const ll INF = LLONG_MAX;
const ll MOD = 1000000007LL;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

ll extgcd(ll a, ll b, ll &x, ll &y) {
  x = 1, y = 0;
  ll g = a;
  if (b != 0)
    g = extgcd(b, a % b, y, x), y -= a / b * x;
  return g;
}
ll ADD(const ll &a, const ll &b, const ll mod = MOD) { return (a + b) % mod; }
ll SUB(const ll &a, const ll &b, const ll mod = MOD) {
  return (a - b + mod) % mod;
}
ll MUL(const ll &a, const ll &b, const ll mod = MOD) {
  return (1LL * a * b) % mod;
}
ll DIV(const ll &a, const ll &b, const ll mod = MOD) {
  ll x, y;
  extgcd(b, mod, x, y);
  return MUL(a, (x + mod) % mod, mod);
}

int n;
vi X, Y;
map<int, map<vi, bool>> memo;

vi res;

bool rec(int i, vi &cur) {
  if (i == n) {
    return true;
  }

  bool &cmemo = memo[i][cur];
  if (cmemo)
    return false;
  cmemo = true;

  int i1 = X[i], i2 = Y[i];

  rep(_, 2) {
    if (cur[i2] > 0) {
      cur[i1]++, cur[i2]--;

      if (rec(i + 1, cur)) {
        res.emplace_back(i1);
        return true;
      }

      cur[i1]--, cur[i2]++;
    }
    swap(i1, i2);
  }

  return false;
}

int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);

  const string T = "ABC";

  int A, B, C;
  cin >> n >> A >> B >> C;
  X = Y = vi(n);
  {
    vector<string> in(n);
    cin >> in;
    map<char, int> c2i;
    rep(i, 3) c2i[T[i]] = i;
    rep(i, n) {
      char c1 = in[i][0], c2 = in[i][1];
      X[i] = c2i[c1], Y[i] = c2i[c2];
    }
  }

  int sum = A + B + C;
  vi cur = {A, B, C};
  if (sum >= 3) {
    rep(i, n) {
      int i1 = X[i], i2 = Y[i];
      if (cur[i1] == 0 and cur[i2] == 0) {
        cout << "No" << endl;
        return 0;
      }
      if (cur[i1] > cur[i2]) {
        swap(i1, i2);
      }
      res.emplace_back(i1);
      cur[i1]++, cur[i2]--;
    }
  } else if (sum == 0) {
    cout << "No" << endl;
    return 0;
  } else {
    if (not rec(0, cur)) {
      cout << "No" << endl;
      return 0;
    }
    reverse(_all(res));
  }

  cout << "Yes" << endl;
  for (auto &e : res) {
    cout << T[e] << endl;
  }

  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>

#define _overload(_1, _2, _3, name, ...) name
#define _rep(i, n) _range(i, 0, n)
#define _range(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define rep(...) _overload(__VA_ARGS__, _range, _rep, )(__VA_ARGS__)

#define _rrep(i, n) _rrange(i, 0, n)
#define _rrange(i, a, b) for (int i = (int)(b)-1; i >= (int)(a); --i)
#define rrep(...) _overload(__VA_ARGS__, _rrange, _rrep, )(__VA_ARGS__)

#define _all(arg) begin(arg), end(arg)
#define uniq(arg) sort(_all(arg)), (arg).erase(unique(_all(arg)), end(arg))
#define bit(n) (1LL << (n))

#define dbg(x)                                                                 \\
  cerr << #x << " = " << (x) << " (L" << __LINE__ << ") " << __FILE__ << endl;

using namespace std;

// overload: >>, <<
template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  for (auto &v : vec)
    is >> v;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const deque<T> &vec) {
  os << "deq[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const set<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_set<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const multiset<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_multiset<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &pa) {
  os << "(" << pa.first << "," << pa.second << ")";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const unordered_map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}

// overload: +, -, *, /
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first + r.first, l.second + r.second);
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first - r.first, l.second - r.second);
}

// template functions
template <typename T> void ndarray(vector<T> &vec, int len) { vec.resize(len); }
template <typename T, typename... Args>
void ndarray(vector<T> &vec, int len, Args... args) {
  vec.resize(len);
  for (auto &v : vec)
    ndarray(v, args...);
}
template <class T> bool chmax(T &a, const T &b) {
  return (a < b) ? (a = b, 1) : 0;
}
template <class T> bool chmin(T &a, const T &b) {
  return (b < a) ? (a = b, 1) : 0;
}

using ll = long long;
using vi = vector<int>;
using vll = vector<ll>;

const double EPS = 1e-10;
const double PI = acos(-1.0);
const int inf = INT_MAX;
const ll INF = LLONG_MAX;
const ll MOD = 1000000007LL;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

ll extgcd(ll a, ll b, ll &x, ll &y) {
  x = 1, y = 0;
  ll g = a;
  if (b != 0)
    g = extgcd(b, a % b, y, x), y -= a / b * x;
  return g;
}
ll ADD(const ll &a, const ll &b, const ll mod = MOD) { return (a + b) % mod; }
ll SUB(const ll &a, const ll &b, const ll mod = MOD) {
  return (a - b + mod) % mod;
}
ll MUL(const ll &a, const ll &b, const ll mod = MOD) {
  return (1LL * a * b) % mod;
}
ll DIV(const ll &a, const ll &b, const ll mod = MOD) {
  ll x, y;
  extgcd(b, mod, x, y);
  return MUL(a, (x + mod) % mod, mod);
}

int n;
vi X, Y;
map<int, map<vi, bool>> memo;

vi res;

bool rec(int i, vi &cur) {
  if (i == n) {
    return true;
  }

  bool &cmemo = memo[i][cur];
  if (cmemo)
    return false;
  cmemo = true;

  int i1 = X[i], i2 = Y[i];

  rep(_, 2) {
    if (cur[i2] > 0) {
      cur[i1]++, cur[i2]--;

      if (rec(i + 1, cur)) {
        res.emplace_back(i1);
        return true;
      }

      cur[i1]--, cur[i2]++;
    }
    swap(i1, i2);
  }

  return false;
}

int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);

  const string T = "ABC";

  int A, B, C;
  cin >> n >> A >> B >> C;
  X = Y = vi(n);
  {
    vector<string> in(n);
    cin >> in;
    map<char, int> c2i;
    rep(i, 3) c2i[T[i]] = i;
    rep(i, n) {
      char c1 = in[i][0], c2 = in[i][1];
      X[i] = c2i[c1], Y[i] = c2i[c2];
    }
  }

  int sum = A + B + C;
  vi cur = {A, B, C};
  if (sum >= 3) {
    rep(i, n) {
      int i1 = X[i], i2 = Y[i];
      if (cur[i1] == 0 and cur[i2] == 0) {
        cout << "No" << endl;
        return 0;
      }
      if (cur[i1] > cur[i2]) {
        swap(i1, i2);
      }
      res.emplace_back(i1);
      cur[i1]++, cur[i1]--;
    }
  } else if (sum == 0) {
    cout << "No" << endl;
    return 0;
  } else {
    assert(false);
    if (not rec(0, cur)) {
      cout << "No" << endl;
      return 0;
    }
    reverse(_all(res));
  }

  cout << "Yes" << endl;
  for (auto &e : res) {
    cout << T[e] << endl;
  }

  return 0;
}