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

#include <bits/stdc++.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<P, ll> T;

long long int INF = 2e18;
const ll fact_table = 1200008;
double Pi = 3.1415926535897932384626;

priority_queue<ll> pql;
priority_queue<P> pqp;
priority_queue<P> bag;
// big priority queue
priority_queue<ll, vector<ll>, greater<ll>> pqls;
priority_queue<P, vector<P>, greater<P>> pqps;
// small priority queue
// top pop

ll dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
ll dy[8] = {0, 1, 0, -1, 1, -1, -1, 1};
char dir[] = "DRUL";
// ↓,→,↑,←

#define endl "\\n"
#ifdef ENJAPMA
#undef endl
#endif
#define p(x) cout << x << endl;
#define el cout << endl;
#define pe(x) cout << x << " ";
#define ps(x) cout << fixed << setprecision(25) << x << endl;
#define pu(x) cout << (x);
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define CLEAR(a) a = decltype(a)();
#define pc(x) cout << x << ",";

const ll mod = 998244353ll;
// const ll mod = 1000000007ll;

ll mypow(ll number1, ll number2, ll mod) {
  if (number2 == 0) {
    return 1ll;
  } else {
    ll number3 = mypow(number1, number2 / 2, mod);
    number3 *= number3;
    number3 %= mod;
    if (number2 % 2 == 1) {
      number3 *= number1;
      number3 %= mod;
    }
    return number3;
  }
}
void YES(bool condition) {
  if (condition) {
    p("YES");
  } else {
    p("NO");
  }
  return;
}
void Yes(bool condition) {
  if (condition) {
    p("Yes");
  } else {
    p("No");
  }
  return;
}
/*
ll fact[fact_table + 5],rfact[fact_table + 5];

void c3_init(){
    fact[0] = rfact[0] = 1;
    for(ll i=1; i<=fact_table; i++){
        fact[i] = (fact[i-1]*i) % mod;
    }
    rfact[fact_table] = mypow(fact[fact_table],mod - 2, mod);
    for(ll i=fact_table; i>=1; i--){
       rfact[i-1] = rfact[i] * i;
       rfact[i-1] %= mod;
    }
    return;}
ll c3(ll n,ll r){
    assert(n >= r);
    assert(n >= 0);
    assert(r >= 0);
    return (((fact[n] * rfact[r]) % mod ) * rfact[n-r]) % mod;}
*/
bool multicase = false;

ll n, m, num, a, b, c, d, e;

ll k;
ll qq[100005];
vector<int> v;

void solve() {
  cin >> n >> a >> b >> c;
  string s;
  for (ll i = 0; i < n; i++) {
    cin >> s;
    if (s == "AB")
      qq[i] = 0;
    if (s == "BC")
      qq[i] = 1;
    if (s == "AC")
      qq[i] = 2;
  }
  for (ll i = 0; i < n; i++) {
    if (qq[i] == 0) {
      if (a == 0 && b == 0) {
        p("No");
        return;
      } else if (a == 0) {
        v.pb(0);
        a++;
        b--;
      } else if (b == 0) {
        v.pb(1);
        a--;
        b++;
      } else {
        if (qq[i + 1] == 1) {
          v.pb(1);
          a--;
          b++;
        } else {
          v.pb(0);
          a++;
          b--;
        }
      }
    } else if (qq[i] == 1) {
      if (b == 0 && c == 0) {
        p("No");
        return;
      } else if (b == 0) {
        v.pb(1);
        b++;
        c--;
      } else if (c == 0) {
        v.pb(2);
        b--;
        c++;
      } else {
        if (qq[i + 1] == 0) {
          v.pb(1);
          b++;
          c--;
        } else {
          v.pb(2);
          b--;
          c++;
        }
      }
    } else {
      if (c == 0 && a == 0) {
        p("No");
        return;
      } else if (c == 0) {
        v.pb(2);
        a--;
        c++;
      } else if (a == 0) {
        v.pb(0);
        a++;
        c--;
      } else {
        if (qq[i + 1] == 0) {
          v.pb(0);
          a++;
          c--;
        } else {
          v.pb(2);
          a--;
          c++;
        }
      }
    }
  }
  p("Yes");
  for (ll i = 0; i < n; i++) {
    if (v[i] == 0)
      p("A");
    if (v[i] == 1)
      p("B");
    if (v[i] == 2)
      p("C");
  }

  return;
}

int main() {

  // init();
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll q, testcase = 1;
  if (multicase) {
    cin >> q;
  } else {
    q = 1;
  }
  while (q--) {
    // pu("Case ");pu("#");pu(testcase);pu(": ");
    solve();
    testcase++;
  }
  // solve();
  return 0;
}


Error: MLE

Fixed submission:

#include <bits/stdc++.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<P, ll> T;

long long int INF = 2e18;
const ll fact_table = 1200008;
double Pi = 3.1415926535897932384626;

priority_queue<ll> pql;
priority_queue<P> pqp;
priority_queue<P> bag;
// big priority queue
priority_queue<ll, vector<ll>, greater<ll>> pqls;
priority_queue<P, vector<P>, greater<P>> pqps;
// small priority queue
// top pop

ll dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
ll dy[8] = {0, 1, 0, -1, 1, -1, -1, 1};
char dir[] = "DRUL";
// ↓,→,↑,←

#define endl "\\n"
#ifdef ENJAPMA
#undef endl
#endif
#define p(x) cout << x << endl;
#define el cout << endl;
#define pe(x) cout << x << " ";
#define ps(x) cout << fixed << setprecision(25) << x << endl;
#define pu(x) cout << (x);
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define CLEAR(a) a = decltype(a)();
#define pc(x) cout << x << ",";

const ll mod = 998244353ll;
// const ll mod = 1000000007ll;

ll mypow(ll number1, ll number2, ll mod) {
  if (number2 == 0) {
    return 1ll;
  } else {
    ll number3 = mypow(number1, number2 / 2, mod);
    number3 *= number3;
    number3 %= mod;
    if (number2 % 2 == 1) {
      number3 *= number1;
      number3 %= mod;
    }
    return number3;
  }
}
void YES(bool condition) {
  if (condition) {
    p("YES");
  } else {
    p("NO");
  }
  return;
}
void Yes(bool condition) {
  if (condition) {
    p("Yes");
  } else {
    p("No");
  }
  return;
}
/*
ll fact[fact_table + 5],rfact[fact_table + 5];

void c3_init(){
    fact[0] = rfact[0] = 1;
    for(ll i=1; i<=fact_table; i++){
        fact[i] = (fact[i-1]*i) % mod;
    }
    rfact[fact_table] = mypow(fact[fact_table],mod - 2, mod);
    for(ll i=fact_table; i>=1; i--){
       rfact[i-1] = rfact[i] * i;
       rfact[i-1] %= mod;
    }
    return;}
ll c3(ll n,ll r){
    assert(n >= r);
    assert(n >= 0);
    assert(r >= 0);
    return (((fact[n] * rfact[r]) % mod ) * rfact[n-r]) % mod;}
*/
bool multicase = false;

ll n, m, num, a, b, c, d, e;

ll k;
ll qq[100005];
const ll B = 15;
int dp[100005][B + 1][B + 1][B + 1];

bool dfs(ll idx, ll a, ll b, ll c) {
  if (dp[idx][a][b][c] >= 0)
    return dp[idx][a][b][c];
  if (a < 0 || b < 0 || c < 0)
    return false;
  if (idx == n)
    return true;
  ll q = qq[idx];
  bool res = false;
  if (q == 0) {
    if (a >= 1)
      res = res | dfs(idx + 1, a - 1, b + 1, c);
    if (b >= 1)
      res = res | dfs(idx + 1, a + 1, b - 1, c);
  } else if (q == 1) {
    if (b >= 1)
      res = res | dfs(idx + 1, a, b - 1, c + 1);
    if (c >= 1)
      res = res | dfs(idx + 1, a, b + 1, c - 1);
  } else {
    if (c >= 1)
      res = res | dfs(idx + 1, a + 1, b, c - 1);
    if (a >= 1)
      res = res | dfs(idx + 1, a - 1, b, c + 1);
  }
  ll v = 0;
  if (res)
    v = 1;
  dp[idx][a][b][c] = v;
  return res;
}

void dfs_print(ll idx, ll a, ll b, ll c) {
  if (idx == n)
    return;
  ll q = qq[idx];
  if (q == 0) {
    if (a >= 1 && dfs(idx + 1, a - 1, b + 1, c)) {
      p("B");
      dfs_print(idx + 1, a - 1, b + 1, c);
    } else {
      p("A");
      dfs_print(idx + 1, a + 1, b - 1, c);
    }
  } else if (q == 1) {
    if (b >= 1 && dfs(idx + 1, a, b - 1, c + 1)) {
      p("C");
      dfs_print(idx + 1, a, b - 1, c + 1);
    } else {
      p("B");
      dfs_print(idx + 1, a, b + 1, c - 1);
    }
  } else {
    if (c >= 1 && dfs(idx + 1, a + 1, b, c - 1)) {
      p("A");
      dfs_print(idx + 1, a + 1, b, c - 1);
    } else {
      p("C");
      dfs_print(idx + 1, a - 1, b, c + 1);
    }
  }
}

void solve() {
  cin >> n >> a >> b >> c;
  string s;
  for (ll i = 0; i < n; i++) {
    cin >> s;
    if (s == "AB")
      qq[i] = 0;
    if (s == "BC")
      qq[i] = 1;
    if (s == "AC")
      qq[i] = 2;
  }
  for (ll i = 0; i <= n + 5; i++) {
    for (ll j = 0; j <= B; j++) {
      for (ll k = 0; k <= B; k++) {
        for (ll l = 0; l <= B; l++) {
          dp[i][j][k][l] = -1;
        }
      }
    }
  }
  if (a >= B)
    a = B;
  if (b >= B)
    b = B;
  if (c >= B)
    c = B;
  bool ok = dfs(0, a, b, c);
  if (ok) {
    p("Yes");
    dfs_print(0, a, b, c);
  } else {
    p("No");
  }
  return;
}

int main() {

  // init();
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll q, testcase = 1;
  if (multicase) {
    cin >> q;
  } else {
    q = 1;
  }
  while (q--) {
    // pu("Case ");pu("#");pu(testcase);pu(": ");
    solve();
    testcase++;
  }
  // solve();
  return 0;
}