Problem p03165 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <algorithm>
#include <cmath>
#include <deque>
#include <fstream>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <string>
#include <unistd.h>
#include <vector>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<bool> vb;
typedef vector<vector<bool>> vvb;
typedef vector<string> vs;
typedef vector<vector<string>> vvs;
typedef vector<char> vc;
typedef vector<vector<char>> vvc;
typedef pair<int, int> P;
typedef pair<ll, ll> PL;
typedef vector<P> vp;
typedef vector<PL> vpl;
typedef vector<vector<P>> vvp;
const int INF = 1001001001;
const ll LINF = 1e18;
const string endstr = "\n";
#define FOR(i, a, b) for (ll i = (a); i < b; i++)
#define REP(i, n) for (ll i = 0; i < n; i++)
#define FORMAP(it, m) for (auto it = m.begin(); it != m.end(); it++)

template <typename T> T gcd(T a, T b) { return (a == 0) ? b : gcd(b % a, a); }
template <typename T> T lcm(T a, T b) { return a / gcd(a, b) * b; }

bool p_comp_fs(const P p1, const P p2) { return p1.first < p2.first; };
bool p_comp_fg(const P p1, const P p2) { return p1.first > p2.first; };
bool p_comp_ss(const P p1, const P p2) { return p1.second < p2.second; };
bool p_comp_sg(const P p1, const P p2) { return p1.second > p2.second; };
template <typename T> vector<T> uniquen(vector<T> vec) {
  vec.erase(unique(vec.begin(), vec.end()), vec.end());
  return vec;
}

string bigger(string s1, string s2) {
  if (s1.size() > s2.size())
    return s1;
  else
    return s2;
}

int main() {
  string s, t;
  cin >> s >> t;
  vvs dp(s.size() + 10, vs(t.size() + 10, ""));
  REP(i, s.size()) {
    REP(j, t.size()) {
      if (s[i] == t[j])
        dp[i + 1][j + 1] = bigger(dp[i][j] + s[i], dp[i + 1][j + 1]);
      dp[i + 1][j + 1] = bigger(dp[i + 1][j + 1], dp[i + 1][j]);
      dp[i + 1][j + 1] = bigger(dp[i + 1][j + 1], dp[i][j + 1]);
    }
  }
  cout << dp[s.size()][t.size()] << endstr;
  return 0;
}


Fixed submission:
#include <algorithm>
#include <cmath>
#include <deque>
#include <fstream>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <string>
#include <unistd.h>
#include <vector>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<bool> vb;
typedef vector<vector<bool>> vvb;
typedef vector<string> vs;
typedef vector<vector<string>> vvs;
typedef vector<char> vc;
typedef vector<vector<char>> vvc;
typedef pair<int, int> P;
typedef pair<ll, ll> PL;
typedef vector<P> vp;
typedef vector<PL> vpl;
typedef vector<vector<P>> vvp;
const int INF = 1001001001;
const ll LINF = 1e18;
const string endstr = "\n";
#define FOR(i, a, b) for (ll i = (a); i < b; i++)
#define REP(i, n) for (ll i = 0; i < n; i++)
#define FORMAP(it, m) for (auto it = m.begin(); it != m.end(); it++)

template <typename T> T gcd(T a, T b) { return (a == 0) ? b : gcd(b % a, a); }
template <typename T> T lcm(T a, T b) { return a / gcd(a, b) * b; }

bool p_comp_fs(const P p1, const P p2) { return p1.first < p2.first; };
bool p_comp_fg(const P p1, const P p2) { return p1.first > p2.first; };
bool p_comp_ss(const P p1, const P p2) { return p1.second < p2.second; };
bool p_comp_sg(const P p1, const P p2) { return p1.second > p2.second; };
template <typename T> vector<T> uniquen(vector<T> vec) {
  vec.erase(unique(vec.begin(), vec.end()), vec.end());
  return vec;
}

string bigger(string s1, string s2) {
  if (s1.size() > s2.size())
    return s1;
  else
    return s2;
}

int main() {
  string s, t;
  cin >> s >> t;
  vvs dp(s.size() + 10, vs(t.size() + 10, ""));
  REP(i, s.size()) {
    REP(j, t.size()) {
      if (s[i] == t[j])
        dp[i + 1][j + 1] = bigger(dp[i][j] + s[i], dp[i + 1][j + 1]);
      dp[i + 1][j + 1] = bigger(dp[i + 1][j + 1], dp[i + 1][j]);
      dp[i + 1][j + 1] = bigger(dp[i + 1][j + 1], dp[i][j + 1]);
    }
    if (i >= 3)
      vs().swap(dp[i - 2]);
  }
  cout << dp[s.size()][t.size()] << endstr;
  return 0;
}