Problem p03165 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#define X first
#define Y second
#define pb push_back
#define rep(X, Y) for (int(X) = 0; (X) < (Y); ++(X))
#define reps(X, S, Y) for (int(X) = S; (X) < (Y); ++(X))
#define rrep(X, Y) for (int(X) = (Y)-1; (X) >= 0; --(X))
#define rreps(X, S, Y) for (int(X) = (Y)-1; (X) >= (S); --(X))
#define repe(X, Y) for ((X) = 0; (X) < (Y); ++(X))
#define peat(X, Y) for (; (X) < (Y); ++(X))
#define all(X) (X).begin(), (X).end()
#define rall(X) (X).rbegin(), (X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)), (X).end())
#define Endl endl

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T> using vv = vector<vector<T>>;
template <class T> ostream &operator<<(ostream &os, const deque<T> &t) {
  os << "{";
  rep(i, t.size()) { os << t[i] << ","; }
  os << "}" << endl;
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &t) {
  os << "{";
  rep(i, t.size()) { os << t[i] << ","; }
  os << "}" << endl;
  return os;
}
template <class T, size_t n>
ostream &operator<<(ostream &os, const array<T, n> &t) {
  os << "{";
  rep(i, n) { os << t[i] << ","; }
  os << "}" << endl;
  return os;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) {
  return os << "(" << t.first << "," << t.second << ")";
}
template <class S, class T, class U>
ostream &operator<<(ostream &os, const tuple<S, T, U> &t) {
  return os << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class S, class T, class U, class V>
ostream &operator<<(ostream &os, const tuple<S, T, U, V> &t) {
  return os << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ","
            << get<3>(t) << ")";
}
template <class S, class T, class U, class V, class W>
ostream &operator<<(ostream &os, const tuple<S, T, U, V, W> &t) {
  return os << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ","
            << get<3>(t) << "," << get<4>(t) << ")";
}
template <class T> inline bool MX(T &l, const T &r) {
  return l < r ? l = r, 1 : 0;
}
template <class T> inline bool MN(T &l, const T &r) {
  return l > r ? l = r, 1 : 0;
}
// #undef NUIP
#ifdef NUIP
#define out(args...)                                                           \
  {                                                                            \
    vector<string> a_r_g_s = s_p_l_i_t(#args, ',');                            \
    e_r_r(a_r_g_s.begin(), args);                                              \
  }
vector<string> s_p_l_i_t(const string &s, char c) {
  vector<string> v;
  int d = 0, f = 0;
  string t;
  for (char c : s) {
    if (!d && c == ',')
      v.pb(t), t = "";
    else
      t += c;
    if (c == '\"' || c == '\'')
      f ^= 1;
    if (!f && c == '(')
      ++d;
    if (!f && c == ')')
      --d;
  }
  v.pb(t);
  return move(v);
}
void e_r_r(vector<string>::iterator it) {}
template <typename T, typename... Args>
void e_r_r(vector<string>::iterator it, T a, Args... args) {
  if (*it == " 1" || *it == "1")
    cerr << endl;
  else
    cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << a << ", ";
  e_r_r(++it, args...);
}
#else
#define out
#endif
#ifdef __cpp_init_captures
template <typename T> vector<T> table(int n, T v) { return vector<T>(n, v); }
template <class... Args> auto table(int n, Args... args) {
  auto val = table(args...);
  return vector<decltype(val)>(n, move(val));
}
#endif
const ll MOD = 1e9 + 7;

int dp[3123][3213];
pii prv[3123][3213];

int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(0);
  string s, t;
  cin >> s >> t;
  int n = s.size(), m = t.size();
  rep(i, n + 1) rep(j, m + 1) {
    if (MX(dp[i + 1][j], dp[i][j]))
      prv[i + 1][j] = pii(1, 0);
    if (MX(dp[i][j + 1], dp[i][j]))
      prv[i][j + 1] = pii(0, 1);
    if (i < n && j < m && s[i] == t[j] && MX(dp[i + 1][j + 1], dp[i][j] + 1))
      prv[i + 1][j + 1] = pii(1, 1);
  }
  string re;
  for (int i = n, j = m; i || j;) {
    pii d = prv[i][j];
    if (d.X && d.Y)
      re += s[i - 1];
    i -= d.X;
    j -= d.Y;
  }
  reverse(all(re));
  cout << re << endl;
  return 0;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#define X first
#define Y second
#define pb push_back
#define rep(X, Y) for (int(X) = 0; (X) < (Y); ++(X))
#define reps(X, S, Y) for (int(X) = S; (X) < (Y); ++(X))
#define rrep(X, Y) for (int(X) = (Y)-1; (X) >= 0; --(X))
#define rreps(X, S, Y) for (int(X) = (Y)-1; (X) >= (S); --(X))
#define repe(X, Y) for ((X) = 0; (X) < (Y); ++(X))
#define peat(X, Y) for (; (X) < (Y); ++(X))
#define all(X) (X).begin(), (X).end()
#define rall(X) (X).rbegin(), (X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)), (X).end())
#define Endl endl

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T> using vv = vector<vector<T>>;
template <class T> ostream &operator<<(ostream &os, const deque<T> &t) {
  os << "{";
  rep(i, t.size()) { os << t[i] << ","; }
  os << "}" << endl;
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &t) {
  os << "{";
  rep(i, t.size()) { os << t[i] << ","; }
  os << "}" << endl;
  return os;
}
template <class T, size_t n>
ostream &operator<<(ostream &os, const array<T, n> &t) {
  os << "{";
  rep(i, n) { os << t[i] << ","; }
  os << "}" << endl;
  return os;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) {
  return os << "(" << t.first << "," << t.second << ")";
}
template <class S, class T, class U>
ostream &operator<<(ostream &os, const tuple<S, T, U> &t) {
  return os << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class S, class T, class U, class V>
ostream &operator<<(ostream &os, const tuple<S, T, U, V> &t) {
  return os << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ","
            << get<3>(t) << ")";
}
template <class S, class T, class U, class V, class W>
ostream &operator<<(ostream &os, const tuple<S, T, U, V, W> &t) {
  return os << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ","
            << get<3>(t) << "," << get<4>(t) << ")";
}
template <class T> inline bool MX(T &l, const T &r) {
  return l < r ? l = r, 1 : 0;
}
template <class T> inline bool MN(T &l, const T &r) {
  return l > r ? l = r, 1 : 0;
}
// #undef NUIP
#ifdef NUIP
#define out(args...)                                                           \
  {                                                                            \
    vector<string> a_r_g_s = s_p_l_i_t(#args, ',');                            \
    e_r_r(a_r_g_s.begin(), args);                                              \
  }
vector<string> s_p_l_i_t(const string &s, char c) {
  vector<string> v;
  int d = 0, f = 0;
  string t;
  for (char c : s) {
    if (!d && c == ',')
      v.pb(t), t = "";
    else
      t += c;
    if (c == '\"' || c == '\'')
      f ^= 1;
    if (!f && c == '(')
      ++d;
    if (!f && c == ')')
      --d;
  }
  v.pb(t);
  return move(v);
}
void e_r_r(vector<string>::iterator it) {}
template <typename T, typename... Args>
void e_r_r(vector<string>::iterator it, T a, Args... args) {
  if (*it == " 1" || *it == "1")
    cerr << endl;
  else
    cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << a << ", ";
  e_r_r(++it, args...);
}
#else
#define out
#endif
#ifdef __cpp_init_captures
template <typename T> vector<T> table(int n, T v) { return vector<T>(n, v); }
template <class... Args> auto table(int n, Args... args) {
  auto val = table(args...);
  return vector<decltype(val)>(n, move(val));
}
#endif
const ll MOD = 1e9 + 7;

int dp[3123][3213];
pii prv[3123][3213];

int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(0);
  string s, t;
  cin >> s >> t;
  int n = s.size(), m = t.size();
  fill(dp[0], dp[3123], -1);
  dp[0][0] = 0;
  rep(i, n + 1) rep(j, m + 1) {
    if (MX(dp[i + 1][j], dp[i][j]))
      prv[i + 1][j] = pii(1, 0);
    if (MX(dp[i][j + 1], dp[i][j]))
      prv[i][j + 1] = pii(0, 1);
    if (i < n && j < m && s[i] == t[j] && MX(dp[i + 1][j + 1], dp[i][j] + 1))
      prv[i + 1][j + 1] = pii(1, 1);
  }
  string re;
  for (int i = n, j = m; i || j;) {
    pii d = prv[i][j];
    if (d.X && d.Y)
      re += s[i - 1];
    i -= d.X;
    j -= d.Y;
  }
  reverse(all(re));
  cout << re << endl;
  return 0;
}