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: Accepted)

#include <bits/stdc++.h>
using namespace std;

#define endl "\n"

typedef long long ll;
typedef pair <ll, ll> pii;
typedef long double ld;

const ll DIM = 3007;
const ll INF = 1000000007;
ll n, m, k;
ll used[DIM][DIM];
// LCL NOT DONE

string s,s1;
int main()
{
   // ios_base::sync_with_stdio(0);
   // cin.tie(0);
   // cout.tie(0);
    cin >> s >> s1;
    for(ll i=1; i<=s.size(); i++)
        for(ll j=1; j<=s1.size(); j++)
        {
            if(s[i-1]==s1[j-1])
                used[i][j]=used[i-1][j-1]+1;
            else
            {
                used[i][j]=max(used[i][j-1],used[i-1][j]);
            }
        }
    ll a=s.size(),b=s1.size();
    string ha="";

    while(a!=0||b!=0)
    {
        if(a==0||b==0)break;
        if(s[a-1]==s1[b-1])
        {
            a--;
            b--;
            ha+=s[a];
        }
        else if(used[a-1][b]==used[a][b])
            a--;
        else
            b--;
    }
    for(ll i=ha.size()-1; i>=0; i--)
        cout<<ha[i];
}