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

#include <bits/stdc++.h>
#ifdef LOCAL_DEBUG
#define DEBUG 1
#define CERR                                                                   \\
  if (DEBUG)                                                                   \\
  cerr
#define MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, NAME, ...) NAME
#define pr(...)                                                                \\
  CERR << MACRO(__VA_ARGS__, pr10, pr9, pr8, pr7, pr6, pr5, pr4, pr3, pr2,     \\
                pr1)(__VA_ARGS__)                                              \\
       << endl
#define pr1(a) (#a) << "=" << (a) << " "
#define pr2(a, b) pr1(a) << pr1(b)
#define pr3(a, b, c) pr1(a) << pr2(b, c)
#define pr4(a, b, c, d) pr1(a) << pr3(b, c, d)
#define pr5(a, b, c, d, e) pr1(a) << pr4(b, c, d, e)
#define pr6(a, b, c, d, e, f) pr1(a) << pr5(b, c, d, e, f)
#define pr7(a, b, c, d, e, f, g) pr1(a) << pr6(b, c, d, e, f, g)
#define pr8(a, b, c, d, e, f, g, h) pr1(a) << pr7(b, c, d, e, f, g, h)
#define pr9(a, b, c, d, e, f, g, h, i) pr1(a) << pr8(b, c, d, e, f, g, h, i)
#define pr10(a, b, c, d, e, f, g, h, i, j)                                     \\
  pr1(a) << pr9(b, c, d, e, f, g, h, i, j)
#define prArr(a)                                                               \\
  {                                                                            \\
    CERR << (#a) << "={";                                                      \\
    int i = 0;                                                                 \\
    for (auto t : (a))                                                         \\
      CERR << (i++ ? ", " : "") << t;                                          \\
    CERR << "}" << endl;                                                       \\
  }
#else
#define DEBUG 0
#define pr(...)
#define prArr(a)
#endif
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL << 60) + 1e9; // ~ 1.15 * 1e18
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int, Int>;
template <class T> T Max(T &a, T b) { return a = max(a, b); }
template <class T> T Min(T &a, T b) { return a = min(a, b); }
template <class T1, class T2> ostream &operator<<(ostream &o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream &operator<<(ostream &o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2> istream &operator>>(istream &i, pair<T1, T2> &p) {
  return i >> p.first >> p.second;
}
template <class T> ostream &operator<<(ostream &o, vector<T> a) {
  Int i = 0;
  for (T t : a)
    o << (i++ ? " " : "") << t;
  return o;
}
template <class T> istream &operator>>(istream &i, vector<T> &a) {
  for (T &t : a)
    i >> t;
  return i;
}
// INSERT ABOVE HERE

Int N, A, B, C;
vector<string> S;
_int used[100010][4][4][4];
_int mem[100010][4][4][4];
Int dfs(Int i, Int a, Int b, Int c) {
  if (a < 0 || b < 0 || c < 0)
    return 0;
  if (i == N)
    return 1;
  if (a >= 4 || b >= 4 || c >= 4) {
    if (S[i] == "AB") {
      if (a >= 4 || a >= b)
        return dfs(i + 1, a - 1, b + 1, c);
      else
        return dfs(i + 1, a + 1, b - 1, c);
    }
    if (S[i] == "BC") {
      if (b >= 4 || b >= c)
        return dfs(i + 1, a, b - 1, c + 1);
      else
        return dfs(i + 1, a, b + 1, c - 1);
    }
    if (S[i] == "AC") {
      if (a >= 4 || a >= c)
        return dfs(i + 1, a - 1, b, c + 1);
      else
        return dfs(i + 1, a + 1, b, c - 1);
    }
  }
  if (used[i][a][b][c]++)
    return mem[i][a][b][c];

  Int o = 0, p = 0, q = 0, r = 0, s = 0, t = 0;
  if (S[i] == "AB") {
    o = dfs(i + 1, a + 1, b - 1, c);
    p = dfs(i + 1, a - 1, b + 1, c);
  }
  if (S[i] == "BC") {
    q = dfs(i + 1, a, b + 1, c - 1);
    r = dfs(i + 1, a, b - 1, c + 1);
  }
  if (S[i] == "AC") {
    s = dfs(i + 1, a + 1, b, c - 1);
    t = dfs(i + 1, a - 1, b, c + 1);
  }
  return mem[i][a][b][c] = max({o, p, q, r, s, t});
}

vector<string> ans;
void dfs2(Int i, Int a, Int b, Int c) {
  if (i == N)
    return;
  if (a >= 4 || b >= 4 || c >= 4) {
    if (S[i] == "AB") {
      if (a >= 4 || a >= b)
        ans.push_back("B"), dfs2(i + 1, a - 1, b + 1, c);
      else
        ans.push_back("A"), dfs2(i + 1, a + 1, b - 1, c);
    }
    if (S[i] == "BC") {
      if (b >= 4 || b >= c)
        ans.push_back("C"), dfs2(i + 1, a, b - 1, c + 1);
      else
        ans.push_back("B"), dfs2(i + 1, a, b + 1, c - 1);
    }
    if (S[i] == "AC") {
      if (a >= 4 || a >= c)
        ans.push_back("C"), dfs2(i + 1, a - 1, b, c + 1);
      else
        ans.push_back("A"), dfs2(i + 1, a + 1, b, c - 1);
    }
    return;
  }

  if (S[i] == "AB") {
    if (dfs(i + 1, a + 1, b - 1, c)) {
      ans.push_back("A");
      dfs2(i + 1, a + 1, b - 1, c);
      return;
    }
    if (dfs(i + 1, a - 1, b + 1, c)) {
      ans.push_back("B");
      dfs2(i + 1, a - 1, b + 1, c);
      return;
    }
  }
  if (S[i] == "BC") {
    if (dfs(i + 1, a, b + 1, c - 1)) {
      ans.push_back("B");
      dfs2(i + 1, a, b + 1, c - 1);
      return;
    }
    if (dfs(i + 1, a, b - 1, c + 1)) {
      ans.push_back("C");
      dfs2(i + 1, a, b - 1, c + 1);
      return;
    }
  }
  if (S[i] == "AC") {
    if (dfs(i + 1, a + 1, b, c - 1)) {
      ans.push_back("A");
      dfs2(i + 1, a + 1, b, c - 1);
      return;
    }
    if (dfs(i + 1, a - 1, b, c + 1)) {
      ans.push_back("C");
      dfs2(i + 1, a - 1, b, c + 1);
      return;
    }
  }
}

signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);
  cin >> N >> A >> B >> C;
  S.resize(N);
  for (Int i = 0; i < N; i++)
    cin >> S[i];

  if (A >= 3 && B >= 3 && C >= 3) {
    cout << "Yes" << endl;
    Int flag[3] = {}; // AB, BC, AC
    for (Int i = 0; i < N; i++) {
      Int idx = 0;
      if (S[i] == "BC")
        idx = 1;
      if (S[i] == "AC")
        idx = 2;
      cout << S[i][flag[idx]] << endl;
      flag[idx] = !flag[idx];
    }
    return 0;
  }

  if (dfs(0, A, B, C) == 0) {
    cout << "No" << endl;
    return 0;
  }

  dfs2(0, A, B, C);
  cout << "Yes" << endl;
  for (Int i = 0; i < N; i++)
    cout << ans[i] << endl;

  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
#ifdef LOCAL_DEBUG
#define DEBUG 1
#define CERR                                                                   \\
  if (DEBUG)                                                                   \\
  cerr
#define MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, NAME, ...) NAME
#define pr(...)                                                                \\
  CERR << MACRO(__VA_ARGS__, pr10, pr9, pr8, pr7, pr6, pr5, pr4, pr3, pr2,     \\
                pr1)(__VA_ARGS__)                                              \\
       << endl
#define pr1(a) (#a) << "=" << (a) << " "
#define pr2(a, b) pr1(a) << pr1(b)
#define pr3(a, b, c) pr1(a) << pr2(b, c)
#define pr4(a, b, c, d) pr1(a) << pr3(b, c, d)
#define pr5(a, b, c, d, e) pr1(a) << pr4(b, c, d, e)
#define pr6(a, b, c, d, e, f) pr1(a) << pr5(b, c, d, e, f)
#define pr7(a, b, c, d, e, f, g) pr1(a) << pr6(b, c, d, e, f, g)
#define pr8(a, b, c, d, e, f, g, h) pr1(a) << pr7(b, c, d, e, f, g, h)
#define pr9(a, b, c, d, e, f, g, h, i) pr1(a) << pr8(b, c, d, e, f, g, h, i)
#define pr10(a, b, c, d, e, f, g, h, i, j)                                     \\
  pr1(a) << pr9(b, c, d, e, f, g, h, i, j)
#define prArr(a)                                                               \\
  {                                                                            \\
    CERR << (#a) << "={";                                                      \\
    int i = 0;                                                                 \\
    for (auto t : (a))                                                         \\
      CERR << (i++ ? ", " : "") << t;                                          \\
    CERR << "}" << endl;                                                       \\
  }
#else
#define DEBUG 0
#define pr(...)
#define prArr(a)
#endif
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL << 60) + 1e9; // ~ 1.15 * 1e18
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int, Int>;
template <class T> T Max(T &a, T b) { return a = max(a, b); }
template <class T> T Min(T &a, T b) { return a = min(a, b); }
template <class T1, class T2> ostream &operator<<(ostream &o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream &operator<<(ostream &o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2> istream &operator>>(istream &i, pair<T1, T2> &p) {
  return i >> p.first >> p.second;
}
template <class T> ostream &operator<<(ostream &o, vector<T> a) {
  Int i = 0;
  for (T t : a)
    o << (i++ ? " " : "") << t;
  return o;
}
template <class T> istream &operator>>(istream &i, vector<T> &a) {
  for (T &t : a)
    i >> t;
  return i;
}
// INSERT ABOVE HERE

Int N, A, B, C;
vector<string> S;
_int used[100010][4][4][4];
_int mem[100010][4][4][4];
Int dfs(Int i, Int a, Int b, Int c) {
  if (a < 0 || b < 0 || c < 0)
    return 0;
  if (i == N)
    return 1;
  if (a >= 4 || b >= 4 || c >= 4) {
    if (S[i] == "AB") {
      if (a >= 4 || a >= b)
        return dfs(i + 1, a - 1, b + 1, c);
      else
        return dfs(i + 1, a + 1, b - 1, c);
    }
    if (S[i] == "BC") {
      if (b >= 4 || b >= c)
        return dfs(i + 1, a, b - 1, c + 1);
      else
        return dfs(i + 1, a, b + 1, c - 1);
    }
    if (S[i] == "AC") {
      if (a >= 4 || a >= c)
        dfs(i + 1, a - 1, b, c + 1);
      else
        return dfs(i + 1, a + 1, b, c - 1);
    }
  }
  if (used[i][a][b][c]++)
    return mem[i][a][b][c];

  Int o = 0, p = 0, q = 0, r = 0, s = 0, t = 0;
  if (S[i] == "AB") {
    o = dfs(i + 1, a + 1, b - 1, c);
    p = dfs(i + 1, a - 1, b + 1, c);
  }
  if (S[i] == "BC") {
    q = dfs(i + 1, a, b + 1, c - 1);
    r = dfs(i + 1, a, b - 1, c + 1);
  }
  if (S[i] == "AC") {
    s = dfs(i + 1, a + 1, b, c - 1);
    t = dfs(i + 1, a - 1, b, c + 1);
  }
  return mem[i][a][b][c] = max({o, p, q, r, s, t});
}

vector<string> ans;
void dfs2(Int i, Int a, Int b, Int c) {
  if (i == N)
    return;
  if (a >= 4 || b >= 4 || c >= 4) {
    if (S[i] == "AB") {
      if (a >= 4 || a >= b)
        ans.push_back("B"), dfs2(i + 1, a - 1, b + 1, c);
      else
        ans.push_back("A"), dfs2(i + 1, a + 1, b - 1, c);
    }
    if (S[i] == "BC") {
      if (b >= 4 || b >= c)
        ans.push_back("C"), dfs2(i + 1, a, b - 1, c + 1);
      else
        ans.push_back("B"), dfs2(i + 1, a, b + 1, c - 1);
    }
    if (S[i] == "AC") {
      if (a >= 4 || a >= c)
        ans.push_back("C"), dfs2(i + 1, a - 1, b, c + 1);
      else
        ans.push_back("A"), dfs2(i + 1, a + 1, b, c - 1);
    }
    return;
  }

  if (S[i] == "AB") {
    if (dfs(i + 1, a + 1, b - 1, c)) {
      ans.push_back("A");
      dfs2(i + 1, a + 1, b - 1, c);
    }
    if (dfs(i + 1, a - 1, b + 1, c)) {
      ans.push_back("B");
      dfs2(i + 1, a - 1, b + 1, c);
    }
  }
  if (S[i] == "BC") {
    if (dfs(i + 1, a, b + 1, c - 1)) {
      ans.push_back("B");
      dfs2(i + 1, a, b + 1, c - 1);
    }
    if (dfs(i + 1, a, b - 1, c + 1)) {
      ans.push_back("C");
      dfs2(i + 1, a, b - 1, c + 1);
    }
  }
  if (S[i] == "AC") {
    if (dfs(i + 1, a + 1, b, c - 1)) {
      ans.push_back("A");
      dfs2(i + 1, a + 1, b, c - 1);
    }
    if (dfs(i + 1, a - 1, b, c + 1)) {
      ans.push_back("C");
      dfs2(i + 1, a - 1, b, c + 1);
    }
  }
}

signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);
  cin >> N >> A >> B >> C;
  S.resize(N);
  for (Int i = 0; i < N; i++)
    cin >> S[i];

  if (A >= 3 && B >= 3 && C >= 3) {
    cout << "Yes" << endl;
    Int flag[3] = {}; // AB, BC, AC
    for (Int i = 0; i < N; i++) {
      Int idx = 0;
      if (S[i] == "BC")
        idx = 1;
      if (S[i] == "AC")
        idx = 2;
      cout << S[i][flag[idx]] << endl;
      flag[idx] = !flag[idx];
    }
    return 0;
  }

  if (dfs(0, A, B, C) == 0) {
    cout << "No" << endl;
    return 0;
  }

  dfs2(0, A, B, C);
  cout << "Yes" << endl;
  for (Int i = 0; i < N; i++)
    cout << ans[i] << endl;

  return 0;
}