Problem:
Score : 100 points

Problem Statement

You are given strings s and t.
Find one longest string that is a subsequence of both s and t.

Notes

A subsequence of a string x is the string obtained by removing zero or more characters from x and concatenating the remaining characters without changing the order.

Constraints

s and t are strings consisting of lowercase English letters.

1 \leq |s|, |t| \leq 3000

Input

Input is given from Standard Input in the following format:

s
t

Output

Print one longest string that is a subsequence of both s and t.
If there are multiple such strings, any of them will be accepted.

Sample Input 1

axyb
abyxb

Sample Output 1

axb

The answer is axb or ayb; either will be accepted.

Sample Input 2

aa
xayaz

Sample Output 2

aa

Sample Input 3

a
z

Sample Output 3

The answer is (an empty string).

Sample Input 4

abracadabra
avadakedavra

Sample Output 4

aaadara

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
using namespace std;
 
#define SKILLER ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define endl "\n"
#define int long long
 
const int N=1e3+5;
string s, t;
int n, m, totW;
int w[105], v[105];
int cache[N][N];
 
int dp(int i, int j)
{
  if(i == n)return 0;
  if(j == m)return 0;
  if(cache[i][j] != -1)return cache[i][j];
  if(s[i] == t[j]){
    cache[i][j] = dp(i+1, j+1) + 1 ;
    return cache[i][j];
  }
  cache[i][j] = max(dp(i+1, j), dp(i, j+1));
  return cache[i][j] ;
}
void path(int i, int j){
    if(i == n)return;
    if(j == m)return;
    if(s[i] == t[j]){
        cout<<s[i];
        return path(i+1, j+1);
    }
    else if(cache[i][j] == cache[i+1][j])
         return path(i+1, j);
    else return path(i , j+1);
}
int32_t main()
{
    SKILLER
     
    memset(cache, -1, sizeof(cache));
    cin >> s >>  t;
    n = s.length();
    m = t.length();
    int ans = dp(0,0);
   // cout<<ans<<"\n";
    path(0, 0);
    return 0;
}