Problem p02692 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <complex>
#include <cstring>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

using namespace std;
#define SZ(x) (int)(x.size())
#define REP(i, n) for (int i = 0; i < n; ++i)
#define FOR(i, a, b) for (int i = a; i < b; ++i)
#define RREP(i, n) for (int i = n - 1; i >= 0; --i)
#define RFOR(i, a, b) for (int i = b - 1; i >= a; --i)

#define all(x) begin(x), end(x)
#define dump(x) cerr << #x << " = " << (x) << endl
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl;

using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using P = pair<int, int>;
const double eps = 1e-8;
const ll MOD = 1000000007;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> p) {
  os << p.first << ":" << p.second;
  return os;
}

template <class T> ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "[";
  REP(i, SZ(v)) {
    if (i)
      os << ", ";
    os << v[i];
  }
  return os << "]";
}

// edit

bool cmm(string s, string t, char c) {
  bool fs = false;
  bool ft = false;

  for (auto e : s) {
    if (e == c)
      fs = true;
  }

  for (auto e : t) {
    if (e == c)
      ft = true;
  }

  return fs && ft;
}

void solve(int N, vector<ll> var, vector<string> S) {
  //    int N;
  //    cin >> N;
  //    ll A, B, C;
  //    cin >> A >> B >> C;
  //    vector<ll> var(3);
  //    for(int i = 0; i < 3; ++i){
  //        cin >> var[i];
  //    }

  //    vector<string> S(N);
  //
  //    for(int i = 0; i < N; ++i){
  //        cin >> S[i];
  //    }

  vector<char> ans;
  for (int i = 0; i < N; ++i) {
    ll &X = var[S[i][0] - 'A'];
    ll &Y = var[S[i][1] - 'A'];

    assert(X >= 0 && Y >= 0);

    if (X == 0 && Y == 0) {
      cout << "No" << endl;
      return;
    }

    if (X == 0 || Y > 1) {
      X++;
      Y--;
      ans.push_back(S[i][0]);
      continue;
    }

    if (Y == 0 || X > 1) {
      X--;
      Y++;
      ans.push_back(S[i][1]);
      continue;
    }

    if (i == N - 1) {
      X--;
      Y++;
      ans.push_back(S[i][1]);
      continue;
    }

    if (S[i] == S[i + 1]) {
      X--;
      Y++;
      ans.push_back(S[i][1]);
      continue;
    }

    if (cmm(S[i], S[i + 1], 'A')) {
      X++;
      Y--;
      ans.push_back(S[i][0]);
      continue;
    } else if (cmm(S[i], S[i + 1], 'C')) {
      X--;
      Y++;
      ans.push_back(S[i][1]);
      continue;
    } else {
      if (S[i] == "AB") {
        X--;
        Y++;
        ans.push_back(S[i][1]);
        continue;
      } else {
        // "BC"
        X++;
        Y--;
        ans.push_back(S[i][0]);
        continue;
      }
    }
  }

  cout << "Yes" << endl;
  for (auto e : ans) {
    cout << e << endl;
  }
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  //    std::ifstream in("input.txt");
  //    std::cin.rdbuf(in.rdbuf());

  //    while(true){
  //        int N = 100000;
  //
  //        vector<ll> var(3);
  //        REP(i,3){
  //            var[i] = rand() % 3;
  //        }
  //
  //        vector<string> base = {"AB", "BC", "AC"};
  //        vector<string> S(N);
  //
  //        for(int i = 0; i < N; ++i){
  //            S[i] = base[rand() % 3];
  //        }
  //
  //        solve(N, var, S);
  //
  //
  //    }

  int N;
  cin >> N;
  vector<ll> var(3);
  for (int i = 0; i < 3; ++i) {
    cin >> var[i];
  }

  vector<string> S(N);

  for (int i = 0; i < N; ++i) {
    cin >> S[i];
  }

  solve(N, var, S);

  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <complex>
#include <cstring>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

using namespace std;
#define SZ(x) (int)(x.size())
#define REP(i, n) for (int i = 0; i < n; ++i)
#define FOR(i, a, b) for (int i = a; i < b; ++i)
#define RREP(i, n) for (int i = n - 1; i >= 0; --i)
#define RFOR(i, a, b) for (int i = b - 1; i >= a; --i)

#define all(x) begin(x), end(x)
#define dump(x) cerr << #x << " = " << (x) << endl
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl;

using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using P = pair<int, int>;
const double eps = 1e-8;
const ll MOD = 1000000007;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> p) {
  os << p.first << ":" << p.second;
  return os;
}

template <class T> ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "[";
  REP(i, SZ(v)) {
    if (i)
      os << ", ";
    os << v[i];
  }
  return os << "]";
}

// edit

bool cmm(string s, string t, char c) {
  bool fs = false;
  bool ft = false;

  for (auto e : s) {
    if (e == c)
      fs = true;
  }

  for (auto e : t) {
    if (e == c)
      ft = true;
  }

  return fs && ft;
}

void solve(int N, vector<ll> var, vector<string> S) {
  //    int N;
  //    cin >> N;
  //    ll A, B, C;
  //    cin >> A >> B >> C;
  //    vector<ll> var(3);
  //    for(int i = 0; i < 3; ++i){
  //        cin >> var[i];
  //    }

  //    vector<string> S(N);
  //
  //    for(int i = 0; i < N; ++i){
  //        cin >> S[i];
  //    }

  vector<char> ans;
  for (int i = 0; i < N; ++i) {
    ll &X = var[S[i][0] - 'A'];
    ll &Y = var[S[i][1] - 'A'];

    assert(X >= 0 && Y >= 0);

    if (X == 0 && Y == 0) {
      cout << "No" << endl;
      return;
    }

    if (X == 0 || Y > 1) {
      X++;
      Y--;
      ans.push_back(S[i][0]);
      continue;
    }

    if (Y == 0 || X > 1) {
      X--;
      Y++;
      ans.push_back(S[i][1]);
      continue;
    }

    assert(X == 1 && Y == 1);

    if (i == N - 1) {
      X--;
      Y++;
      ans.push_back(S[i][1]);
      continue;
    }

    if (S[i] == S[i + 1]) {
      X--;
      Y++;
      ans.push_back(S[i][1]);
      continue;
    }

    if (cmm(S[i], S[i + 1], 'A')) {
      X++;
      Y--;
      ans.push_back(S[i][0]);
      continue;
    } else if (cmm(S[i], S[i + 1], 'C')) {
      X--;
      Y++;
      ans.push_back(S[i][1]);
      continue;
    } else {
      if (S[i] == "AB") {
        X--;
        Y++;
        ans.push_back(S[i][1]);
        continue;
      } else {
        // "BC"
        X++;
        Y--;
        ans.push_back(S[i][0]);
        continue;
      }
    }
  }

  cout << "Yes" << endl;
  for (auto e : ans) {
    cout << e << endl;
  }

  //    assert(false);
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  //    std::ifstream in("input.txt");
  //    std::cin.rdbuf(in.rdbuf());

  while (true) {
    int N = 1000;

    vector<ll> var(3);
    REP(i, 3) { var[i] = rand() % 3; }

    vector<string> base = {"AB", "BC", "AC"};
    vector<string> S(N);

    for (int i = 0; i < N; ++i) {
      S[i] = base[rand() % 3];
    }

    solve(N, var, S);
  }

  int N;
  cin >> N;
  vector<ll> var(3);
  for (int i = 0; i < 3; ++i) {
    cin >> var[i];
  }

  vector<string> S(N);

  for (int i = 0; i < N; ++i) {
    cin >> S[i];
  }

  solve(N, var, S);

  return 0;
}