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

#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define _USE_MATH_DEFINES
#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <time.h>
#include <tuple>
#include <unordered_map>
#include <vector>
using namespace std;
using ll = long long;
using ld = long double;
#define int long long
#define all(a) (a).begin(), (a).end()
#define fs first
#define sc second
#define xx first
#define yy second.first
#define zz second.second
#define H pair<int, int>
#define P pair<int, pair<int, int>>
#define Q(i, j, k) mkp(i, mkp(j, k))
#define rng(i, s, n) for (int i = (s); i < (n); i++)
#define rep(i, n) rng(i, 0, (n))
#define mkp make_pair
#define vec vector
#define pb emplace_back
#define crdcomp(b)                                                             \\
  sort(all((b)));                                                              \\
  (b).erase(unique(all((b))), (b).end())
#define getidx(b, i) lower_bound(all(b), (i)) - b.begin()
#define ssp(i, n) (i == (int)(n)-1 ? "\\n" : " ")
#define ctoi(c) (int)(c - '0')
#define itoc(c) (char)(c + '0')
#define pp(x, y) pb(H{x, y})
#define ppp(x, y, z) pb(Q(x, y, z))
#define cyes printf("Yes\\n")
#define cno printf("No\\n")
#define cdf(n)                                                                 \\
  int quetimes_ = (n);                                                         \\
  rep(qq123_, quetimes_)
#define gcj printf("Case #%lld: ", qq123_ + 1)
#define readv(a, n)                                                            \\
  a.resize(n, 0);                                                              \\
  rep(i, (n)) a[i] = read()
// #define endl "\\n"
constexpr int mod = 1e9 + 7;
constexpr int Mod = 998244353;
constexpr int MXN = 500000 + 100;
constexpr ld EPS = 1e-10;
constexpr ll inf = 3 * 1e18;
constexpr int Inf = 15 * 1e8;
const vec<int> dx{-1, 1, 0, 0}, dy{0, 0, -1, 1};
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
ll read() {
  ll u, k = scanf("%lld", &u);
  return u;
}
string reads() {
  string s;
  cin >> s;
  return s;
}
H readh(bool g = 0) {
  H u;
  int k = scanf("%lld %lld", &u.fs, &u.sc);
  if (g)
    u.fs--, u.sc--;
  return u;
}
void printh(H t) { printf("%lld %lld\\n", t.fs, t.sc); }
bool inarea(H t, int h, int w) {
  return 0 <= t.fs && t.fs < h && 0 <= t.sc && t.sc < w;
}
ll gcd(ll i, ll j) { return j ? gcd(j, i % j) : i; }
ll lcm(ll i, ll j) { return i / gcd(i, j) * j; }
ll mod_pow(ll x, ll n, ll p = mod) {
  ll res = 1;
  x %= p;
  while (n > 0) {
    if (n & 1)
      res = res * x % p;
    x = x * x % p;
    n >>= 1;
  }
  return res;
} // x^n%p
ll bitcount(ll x) {
  int sum = 0;
  for (int i = 0; i < 60; i++)
    if ((1ll << i) & x)
      sum++;
  return sum;
}
constexpr int fn_ = 1000005;
ll fact_[fn_], comp_[fn_];
ll comb(ll x, ll y, ll Mod = mod) {
  if (!fact_[0]) {
    fact_[0] = 1;
    comp_[0] = 1;
    for (int i = 1; i < fn_; i++)
      fact_[i] = fact_[i - 1] * i % Mod;
    comp_[fn_ - 1] = mod_pow(fact_[fn_ - 1], Mod - 2, Mod);
    for (int i = fn_ - 2; i > 0; i--)
      comp_[i] = comp_[i + 1] * (i + 1) % Mod;
  }
  if (x < y)
    return 0;
  return fact_[x] * comp_[x - y] % Mod * comp_[y] % Mod;
}
//--------------------------------------------------------------
int n;
map<vec<int>, bool> dp[100001];
vec<string> v;
string solve(int i, vec<int> a) {
  if (a[0] < 0 || a[1] < 0 || a[2] < 0)
    return "-1";
  if (dp[i][vec<int>{a[0], a[1]}])
    return "-1";
  if (i == n) {
    return "";
  }
  string s = v[i], res;
  if (s == "AB") {
    if (a[0] - a[1] < 10) {
      a[0]++, a[1]--;
      res = solve(i + 1, a);
      if (res != "-1") {
        res.insert(res.begin(), 'A');
        return res;
      }
      a[0]--, a[1]++;
    }
    if (a[1] - a[0] < 10) {
      a[0]--, a[1]++;
      res = solve(i + 1, a);
      if (res != "-1") {
        res.insert(res.begin(), 'B');
        return res;
      }
      a[0]++, a[1]--;
    }
  } else if (s == "BC") {
    if (a[1] - a[2] < 10) {
      a[1]++, a[2]--;
      res = solve(i + 1, a);
      if (res != "-1") {
        res.insert(res.begin(), 'B');
        return res;
      }
      a[1]--, a[2]++;
    }
    if (a[2] - a[1] < 10) {
      a[1]--, a[2]++;
      res = solve(i + 1, a);
      if (res != "-1") {
        res.insert(res.begin(), 'C');
        return res;
      }
      a[1]++, a[2]--;
    }
  } else {
    if (a[2] - a[0] < 10) {
      a[2]++, a[0]--;
      res = solve(i + 1, a);
      if (res != "-1") {
        res.insert(res.begin(), 'C');
        return res;
      }
      a[2]--, a[0]++;
    }
    if (a[0] - a[2] < 10) {
      a[2]--, a[0]++;
      res = solve(i + 1, a);
      if (res != "-1") {
        res.insert(res.begin(), 'A');
        return res;
      }
      a[2]++, a[0]--;
    }
  }
  dp[i][vec<int>{a[0], a[1]}] = 1;
  return "-1";
}
signed main() {
  int a[3];
  cin >> n >> a[0] >> a[1] >> a[2];
  string s;
  vec<char> ans;
  if (a[0] >= 10 && a[1] >= 10 && a[2] >= 10) {
    rep(i, n) {
      cin >> s;
      if (s == "AB") {
        if (a[0] < a[1]) {
          a[0]++, a[1]--;
          ans.pb('A');
        } else {
          a[0]--, a[1]++;
          ans.pb('B');
        }
      } else if (s == "BC") {
        if (a[1] < a[2]) {
          a[1]++, a[2]--;
          ans.pb('B');
        } else {
          a[1]--, a[2]++;
          ans.pb('C');
        }
      } else {
        if (a[2] < a[0]) {
          a[2]++, a[0]--;
          ans.pb('C');
        } else {
          a[2]--, a[0]++;
          ans.pb('A');
        }
      }
      if (a[0] < 0 || a[1] < 0 || a[2] < 0) {
        cno;
        return 0;
      }
    }
    cyes;
    rep(i, n) cout << ans[i] << endl;
  } else {
    rep(i, n) v.pb(reads());
    string s = solve(0, vec<int>{a[0], a[1], a[2]});
    if (s == "-1")
      cno;
    else {
      cyes;
      rep(i, n) cout << s[i] << endl;
    }
  }
}

Error: -11

Fixed submission:

#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define _USE_MATH_DEFINES
#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <time.h>
#include <tuple>
#include <unordered_map>
#include <vector>
using namespace std;
using ll = long long;
using ld = long double;
#define int long long
#define all(a) (a).begin(), (a).end()
#define fs first
#define sc second
#define xx first
#define yy second.first
#define zz second.second
#define H pair<int, int>
#define P pair<int, pair<int, int>>
#define Q(i, j, k) mkp(i, mkp(j, k))
#define rng(i, s, n) for (int i = (s); i < (n); i++)
#define rep(i, n) rng(i, 0, (n))
#define mkp make_pair
#define vec vector
#define pb emplace_back
#define crdcomp(b)                                                             \\
  sort(all((b)));                                                              \\
  (b).erase(unique(all((b))), (b).end())
#define getidx(b, i) lower_bound(all(b), (i)) - b.begin()
#define ssp(i, n) (i == (int)(n)-1 ? "\\n" : " ")
#define ctoi(c) (int)(c - '0')
#define itoc(c) (char)(c + '0')
#define pp(x, y) pb(H{x, y})
#define ppp(x, y, z) pb(Q(x, y, z))
#define cyes printf("Yes\\n")
#define cno printf("No\\n")
#define cdf(n)                                                                 \\
  int quetimes_ = (n);                                                         \\
  rep(qq123_, quetimes_)
#define gcj printf("Case #%lld: ", qq123_ + 1)
#define readv(a, n)                                                            \\
  a.resize(n, 0);                                                              \\
  rep(i, (n)) a[i] = read()
// #define endl "\\n"
constexpr int mod = 1e9 + 7;
constexpr int Mod = 998244353;
constexpr int MXN = 500000 + 100;
constexpr ld EPS = 1e-10;
constexpr ll inf = 3 * 1e18;
constexpr int Inf = 15 * 1e8;
const vec<int> dx{-1, 1, 0, 0}, dy{0, 0, -1, 1};
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
ll read() {
  ll u, k = scanf("%lld", &u);
  return u;
}
string reads() {
  string s;
  cin >> s;
  return s;
}
H readh(bool g = 0) {
  H u;
  int k = scanf("%lld %lld", &u.fs, &u.sc);
  if (g)
    u.fs--, u.sc--;
  return u;
}
void printh(H t) { printf("%lld %lld\\n", t.fs, t.sc); }
bool inarea(H t, int h, int w) {
  return 0 <= t.fs && t.fs < h && 0 <= t.sc && t.sc < w;
}
ll gcd(ll i, ll j) { return j ? gcd(j, i % j) : i; }
ll lcm(ll i, ll j) { return i / gcd(i, j) * j; }
ll mod_pow(ll x, ll n, ll p = mod) {
  ll res = 1;
  x %= p;
  while (n > 0) {
    if (n & 1)
      res = res * x % p;
    x = x * x % p;
    n >>= 1;
  }
  return res;
} // x^n%p
ll bitcount(ll x) {
  int sum = 0;
  for (int i = 0; i < 60; i++)
    if ((1ll << i) & x)
      sum++;
  return sum;
}
constexpr int fn_ = 1000005;
ll fact_[fn_], comp_[fn_];
ll comb(ll x, ll y, ll Mod = mod) {
  if (!fact_[0]) {
    fact_[0] = 1;
    comp_[0] = 1;
    for (int i = 1; i < fn_; i++)
      fact_[i] = fact_[i - 1] * i % Mod;
    comp_[fn_ - 1] = mod_pow(fact_[fn_ - 1], Mod - 2, Mod);
    for (int i = fn_ - 2; i > 0; i--)
      comp_[i] = comp_[i + 1] * (i + 1) % Mod;
  }
  if (x < y)
    return 0;
  return fact_[x] * comp_[x - y] % Mod * comp_[y] % Mod;
}
//--------------------------------------------------------------
int n;
bool dp[100000][40][40];
vec<string> v;
string solve(int i, vec<int> a) {
  if (a[0] < 0 || a[1] < 0 || a[2] < 0)
    return "-1";
  if (dp[i][a[0]][a[1]])
    return "-1";
  if (i == n) {
    return "";
  }
  string s = v[i], res;
  if (s == "AB") {
    a[0]++, a[1]--;
    res = solve(i + 1, a);
    if (res != "-1") {
      res.insert(res.begin(), 'A');
      return res;
    }
    a[0]--, a[1]++;
    a[0]--, a[1]++;
    res = solve(i + 1, a);
    if (res != "-1") {
      res.insert(res.begin(), 'B');
      return res;
    }
    a[0]++, a[1]--;
  } else if (s == "BC") {
    a[1]++, a[2]--;
    res = solve(i + 1, a);
    if (res != "-1") {
      res.insert(res.begin(), 'B');
      return res;
    }
    a[1]--, a[2]++;
    a[1]--, a[2]++;
    res = solve(i + 1, a);
    if (res != "-1") {
      res.insert(res.begin(), 'C');
      return res;
    }
    a[1]++, a[2]--;
  } else {
    a[2]++, a[0]--;
    res = solve(i + 1, a);
    if (res != "-1") {
      res.insert(res.begin(), 'C');
      return res;
    }
    a[2]--, a[0]++;
    a[2]--, a[0]++;
    res = solve(i + 1, a);
    if (res != "-1") {
      res.insert(res.begin(), 'A');
      return res;
    }
    a[2]++, a[0]--;
  }
  dp[i][a[0]][a[1]] = 1;
  return "-1";
}
signed main() {
  int a[3];
  cin >> n >> a[0] >> a[1] >> a[2];
  string s;
  vec<char> ans;
  if (a[0] >= 10 && a[1] >= 10 && a[2] >= 10) {
    rep(i, n) {
      cin >> s;
      if (s == "AB") {
        if (a[0] < a[1]) {
          a[0]++, a[1]--;
          ans.pb('A');
        } else {
          a[0]--, a[1]++;
          ans.pb('B');
        }
      } else if (s == "BC") {
        if (a[1] < a[2]) {
          a[1]++, a[2]--;
          ans.pb('B');
        } else {
          a[1]--, a[2]++;
          ans.pb('C');
        }
      } else {
        if (a[2] < a[0]) {
          a[2]++, a[0]--;
          ans.pb('C');
        } else {
          a[2]--, a[0]++;
          ans.pb('A');
        }
      }
      if (a[0] < 0 || a[1] < 0 || a[2] < 0) {
        cno;
        return 0;
      }
    }
    cyes;
    rep(i, n) cout << ans[i] << endl;
  } else {
    rep(i, n) v.pb(reads());
    string s = solve(0, vec<int>{a[0], a[1], a[2]});
    if (s == "-1")
      cno;
    else {
      cyes;
      rep(i, n) cout << s[i] << endl;
    }
  }
}