Problem p03165 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <string>
#include <unordered_map>
#include <vector>

#define ll long long
#define ld long double
#define ull unsigned long long
#define endl "\n"
#define MohamedMotaz                                                           \
  ios::sync_with_stdio(0);                                                     \
  cin.tie(0);                                                                  \
  ios_base::sync_with_stdio(0);
#define f(a, b, c) for (int a = b; a < c; a++)
#define fr(a, b, c) for (int a = b; a >= c; a--)
using namespace std;

// ll fact[1000001]; ll inv[1000001];
// ll primes[100007];
// ll arr[1000007];
// ll modPower(ll b, ll p) {
//	if (p == 0)
//		return 1;
//
//	ll halfpow = modPower(b, p / 2);
//	ll toReturn = (halfpow * halfpow) % mod;
//	if (p % 2)
//		toReturn = (toReturn * b) % mod;
//
//	return toReturn;
// }
//
// ll fastPower(ll b, ll p) {
//	if (p == 0)
//		return 1;
//	ll ans = fastPower(b, p / 2);
//	ans = (ans * ans);
//	if (p % 2 != 0)
//		ans = (ans * b);
//	return ans;
// }
// ll GcdRecursive(ll a, ll b) {
//	if (b == 0) return a;
//	return GcdRecursive(b, a % b);
// }
// ll modLCM(ll a, ll b) {
//	ll val = GcdRecursive(a, b);
//	ll tmp = ((a % mod) * (b % mod)) % mod;
//	ll finalVal = ((tmp % mod) * (arr[val] % mod)) % mod;
//	return finalVal;
//
// }
// ll LCM(ll a, ll b) {
//	return (a * b) / GcdRecursive(a, b);
// }
// void move1step(ll& a, ll& b, ll q) { // a and b by reference
//	ll c = a - q * b;
//	a = b;
//	b = c;
// }
// ll GcdIterative(ll a, ll b) {
//	while (b) move1step(a, b, a / b);
//	return a;
// }
//
// void pre(ll n) {
//
//	fact[0] = 1;
//	inv[0] = 1;
//
//	for (ll i = 1; i <= n; i++) {
//		fact[i] = (i * fact[i - 1]) % mod;
//		inv[i] = modPower(fact[i], mod - 2);
//		arr[i] = modPower(i, mod - 2);
//	}
// }
//
// ll npr(ll n, ll r) {
//	return ((fact[n] * inv[n - r]) % mod);
// }
//
// ll ncr(ll n, ll r) {
//	return ((((fact[n] * inv[n - r]) % mod) * inv[r]) % mod);
// }
//
// void sieve(ll val) {
//	memset(primes, 1, sizeof primes);
//	primes[0] = primes[1] = false;
//	for (int i = 2; i <= val; i++) {
//		if (primes[i]) {
//			for (int j = i * i; j <= val; j += i) {
//				primes[j] = 0;
//			}
//		}
//	}
//
// }

const ll mod = 1e9 + 7;
const ll N = 2e3 + 7;
const ll inf = 1e9 + 5;

string s, t;
ll dp[N][N];
int main() {
  MohamedMotaz;
  cin >> s >> t;
  memset(dp, 0, sizeof(dp));
  f(i, 1, s.size() + 1) {
    f(j, 1, t.size() + 1) {
      if (s[i - 1] == t[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1] + 1;
      } else {
        dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
      }
    }
  }

  // f(i,1,s.size() + 1) {f(j,1,t.size() + 1) cout << dp[i][j] << " "; cout <<
  // endl;}

  ll a = s.size(), b = t.size();
  string ans = "";

  while (a && b) {
    if (dp[a][b] == dp[a - 1][b])
      a--;
    else if (dp[a][b] == dp[a][b - 1])
      b--;
    else {
      ans.push_back(s[a - 1]);
      a--;
      b--;
    }
  }
  reverse(ans.begin(), ans.end());
  cout << ans;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <string>
#include <unordered_map>
#include <vector>

#define ll long long
#define ld long double
#define ull unsigned long long
#define endl "\n"
#define MohamedMotaz                                                           \
  ios::sync_with_stdio(0);                                                     \
  cin.tie(0);                                                                  \
  ios_base::sync_with_stdio(0);
#define f(a, b, c) for (int a = b; a < c; a++)
#define fr(a, b, c) for (int a = b; a >= c; a--)
using namespace std;

// ll fact[1000001]; ll inv[1000001];
// ll primes[100007];
// ll arr[1000007];
// ll modPower(ll b, ll p) {
//	if (p == 0)
//		return 1;
//
//	ll halfpow = modPower(b, p / 2);
//	ll toReturn = (halfpow * halfpow) % mod;
//	if (p % 2)
//		toReturn = (toReturn * b) % mod;
//
//	return toReturn;
// }
//
// ll fastPower(ll b, ll p) {
//	if (p == 0)
//		return 1;
//	ll ans = fastPower(b, p / 2);
//	ans = (ans * ans);
//	if (p % 2 != 0)
//		ans = (ans * b);
//	return ans;
// }
// ll GcdRecursive(ll a, ll b) {
//	if (b == 0) return a;
//	return GcdRecursive(b, a % b);
// }
// ll modLCM(ll a, ll b) {
//	ll val = GcdRecursive(a, b);
//	ll tmp = ((a % mod) * (b % mod)) % mod;
//	ll finalVal = ((tmp % mod) * (arr[val] % mod)) % mod;
//	return finalVal;
//
// }
// ll LCM(ll a, ll b) {
//	return (a * b) / GcdRecursive(a, b);
// }
// void move1step(ll& a, ll& b, ll q) { // a and b by reference
//	ll c = a - q * b;
//	a = b;
//	b = c;
// }
// ll GcdIterative(ll a, ll b) {
//	while (b) move1step(a, b, a / b);
//	return a;
// }
//
// void pre(ll n) {
//
//	fact[0] = 1;
//	inv[0] = 1;
//
//	for (ll i = 1; i <= n; i++) {
//		fact[i] = (i * fact[i - 1]) % mod;
//		inv[i] = modPower(fact[i], mod - 2);
//		arr[i] = modPower(i, mod - 2);
//	}
// }
//
// ll npr(ll n, ll r) {
//	return ((fact[n] * inv[n - r]) % mod);
// }
//
// ll ncr(ll n, ll r) {
//	return ((((fact[n] * inv[n - r]) % mod) * inv[r]) % mod);
// }
//
// void sieve(ll val) {
//	memset(primes, 1, sizeof primes);
//	primes[0] = primes[1] = false;
//	for (int i = 2; i <= val; i++) {
//		if (primes[i]) {
//			for (int j = i * i; j <= val; j += i) {
//				primes[j] = 0;
//			}
//		}
//	}
//
// }

const ll mod = 1e9 + 7;
const ll N = 3e3 + 7;
const ll inf = 1e9 + 5;

string s, t;
ll dp[N][N];
int main() {
  MohamedMotaz;
  cin >> s >> t;
  memset(dp, 0, sizeof(dp));
  f(i, 1, s.size() + 1) {
    f(j, 1, t.size() + 1) {
      if (s[i - 1] == t[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1] + 1;
      } else {
        dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
      }
    }
  }

  // f(i,1,s.size() + 1) {f(j,1,t.size() + 1) cout << dp[i][j] << " "; cout <<
  // endl;}

  ll a = s.size(), b = t.size();
  string ans = "";

  while (a && b) {
    if (dp[a][b] == dp[a - 1][b])
      a--;
    else if (dp[a][b] == dp[a][b - 1])
      b--;
    else {
      ans.push_back(s[a - 1]);
      a--;
      b--;
    }
  }
  reverse(ans.begin(), ans.end());
  cout << ans;
}