Problem p02692 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
#define Rep(i, n) for (int i = 0; i < (int)(n); i++)
#define For(i, n1, n2) for (int i = (int)(n1); i < (int)(n2); i++)
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define RREP(i, n) for (ll i = ((ll)(n)-1); i >= 0; i--)
#define FOR(i, n1, n2) for (ll i = (ll)(n1); i < (ll)(n2); i++)
#define RFOR(i, n1, n2) for (ll i = ((ll)(n1)-1); i >= (ll)(n2); i--)
#define all(a) (a).begin(), (a).end()
#define IOS std::cin.tie(0), std::ios::sync_with_stdio(false)

namespace idaten {

using namespace std;
using ll = int_fast64_t;
using ull = uint_fast64_t;
using P = std::pair<int64_t, int64_t>;
template <typename T1, typename T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
inline std::istream &operator>>(std::istream &is, std::vector<T> &v) {
  for (T &x : v) {
    is >> x;
  }
  return is;
}
template <class T>
inline std::ostream &operator<<(std::ostream &os, const std::vector<T> &v) {
  for (auto itr = v.begin(); itr != v.end();) {
    os << (*itr) << ((++itr != v.end()) ? " " : "");
  }
  return os;
}
template <class V, typename T> inline void fill(V &v, const T &val) { v = val; }
template <class V, typename T>
inline void fill(std::vector<V> &v, const T &val) {
  for (V &x : v) {
    fill(x, val);
  }
}
template <class V, typename H>
inline void resize(std::vector<V> &v, const H h) {
  v.resize(h);
}
template <class V, typename H, typename... T>
inline void resize(std::vector<V> &v, const H &h, const T &...t) {
  v.resize(h);
  for (auto &x : v) {
    resize(x, t...);
  }
}
inline void put() {}
template <class T> inline void put(const T &first) {
  std::cout << first << "\n";
}
template <class T, class... N>
inline void put(const T &first, const N &...rest) {
  std::cout << first << " ";
  put(rest...);
}

int f(string &s) {
  if (s == "AB") {
    return 2;
  } else if (s == "BC") {
    return 0;
  } else {
    return 1;
  }
}

void solve() {
  IOS;
  ll n, a, b, c;
  cin >> n >> a >> b >> c;
  vector<ll> d = {a, b, c};
  vector<string> s(n);
  cin >> s;
  vector<int> res(n);
  REP(i, n) {
    int t1, t2, t3;
    int t4 = f(s[i]);
    if (s[i] == "AB") {
      t1 = 0, t2 = 1, t3 = 2;
    } else if (s[i] == "BC") {
      t1 = 1, t2 = 2, t3 = 0;
    } else {
      t1 = 0, t2 = 2, t3 = 1;
    }
    if (d[t1] == d[t2] && d[t1] == 0) {
      put("No");
      return;
    }
    if (d[t1] == d[t2] && d[t1] == 1 && d[t3] == 0 && i < n - 1) {
      int t5 = f(s[i + 1]);
      int t6 = 3 - t4 - t5;
      int t7 = t1 + t2 - t6;
      res[i] = t6;
      d[t7]--;
      d[t6]++;
    } else {
      if (d[t1] < d[t2]) {
        res[i] = t1;
        d[t1]++;
        d[t2]--;
      } else {
        res[i] = t2;
        d[t1]--;
        d[t2]++;
      }
    }
  }
  put("Yes");
  REP(i, n) {
    char c = (char)'A' + res[i];
    put(c);
  }
}
} // namespace idaten

int main() {
  idaten::solve();
  return 0;
}


Fixed submission:
#include "bits/stdc++.h"
#define Rep(i, n) for (int i = 0; i < (int)(n); i++)
#define For(i, n1, n2) for (int i = (int)(n1); i < (int)(n2); i++)
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define RREP(i, n) for (ll i = ((ll)(n)-1); i >= 0; i--)
#define FOR(i, n1, n2) for (ll i = (ll)(n1); i < (ll)(n2); i++)
#define RFOR(i, n1, n2) for (ll i = ((ll)(n1)-1); i >= (ll)(n2); i--)
#define all(a) (a).begin(), (a).end()
#define IOS std::cin.tie(0), std::ios::sync_with_stdio(false)

namespace idaten {

using namespace std;
using ll = int_fast64_t;
using ull = uint_fast64_t;
using P = std::pair<int64_t, int64_t>;
template <typename T1, typename T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
inline std::istream &operator>>(std::istream &is, std::vector<T> &v) {
  for (T &x : v) {
    is >> x;
  }
  return is;
}
template <class T>
inline std::ostream &operator<<(std::ostream &os, const std::vector<T> &v) {
  for (auto itr = v.begin(); itr != v.end();) {
    os << (*itr) << ((++itr != v.end()) ? " " : "");
  }
  return os;
}
template <class V, typename T> inline void fill(V &v, const T &val) { v = val; }
template <class V, typename T>
inline void fill(std::vector<V> &v, const T &val) {
  for (V &x : v) {
    fill(x, val);
  }
}
template <class V, typename H>
inline void resize(std::vector<V> &v, const H h) {
  v.resize(h);
}
template <class V, typename H, typename... T>
inline void resize(std::vector<V> &v, const H &h, const T &...t) {
  v.resize(h);
  for (auto &x : v) {
    resize(x, t...);
  }
}
inline void put() {}
template <class T> inline void put(const T &first) {
  std::cout << first << "\n";
}
template <class T, class... N>
inline void put(const T &first, const N &...rest) {
  std::cout << first << " ";
  put(rest...);
}

int f(string &s) {
  if (s == "AB") {
    return 2;
  } else if (s == "BC") {
    return 0;
  } else {
    return 1;
  }
}

void solve() {
  IOS;
  ll n, a, b, c;
  cin >> n >> a >> b >> c;
  vector<ll> d = {a, b, c};
  vector<string> s(n);
  cin >> s;
  vector<int> res(n);
  REP(i, n) {
    int t1, t2, t3;
    int t4 = f(s[i]);
    if (s[i] == "AB") {
      t1 = 0, t2 = 1, t3 = 2;
    } else if (s[i] == "BC") {
      t1 = 1, t2 = 2, t3 = 0;
    } else {
      t1 = 0, t2 = 2, t3 = 1;
    }
    if (d[t1] == d[t2] && d[t1] == 0) {
      put("No");
      return;
    }
    if (d[t1] == d[t2] && d[t1] == 1 && d[t3] == 0 && i < n - 1) {
      int t5 = f(s[i + 1]);
      if (t4 == t5) {
        res[i] = t2;
        d[t1]--;
        d[t2]++;
      } else {
        int t6 = 3 - t4 - t5;
        int t7 = t1 + t2 - t6;
        res[i] = t6;
        d[t7]--;
        d[t6]++;
      }

    } else {
      if (d[t1] < d[t2]) {
        res[i] = t1;
        d[t1]++;
        d[t2]--;
      } else {
        res[i] = t2;
        d[t1]--;
        d[t2]++;
      }
    }
  }
  put("Yes");
  REP(i, n) {
    char c = (char)'A' + res[i];
    put(c);
  }
}
} // namespace idaten

int main() {
  idaten::solve();
  return 0;
}