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;
typedef  long long ll;
int mod = 1e9+7;

int main(){
 
	ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    string s1, s2;
    cin>>s1>>s2;

    int n = s1.length();
    int m = s2.length();

    vector<vector<pair<ll, pair<ll, ll>>>> dp(n+1, vector<pair<ll, pair<ll, ll>>>(m+1, {0, {0, 0}}));

    for(ll i=0; i<=n; i++){
    	for(ll j=0; j<=m; j++){
    		if(i && j){

    			if(s1[i-1]==s2[j-1]){
    				dp[i][j] = {dp[i-1][j-1].first+1, {i-1, j-1}};
    			}else{
    				if(dp[i-1][j].first>dp[i][j-1].first){
    					dp[i][j] = {dp[i-1][j].first, {i-1, j}};
    				}else dp[i][j] = {dp[i][j-1].first, {i, j-1}};
    			}
    		}
    	}
    }
    string ans;
    ll i=n, j=m;
    // cout<<dp[i][j].first<<endl;
    while(i && j){
    	// cout<<dp[i][j].second.first<<" "<<dp[i][j].second.second<<endl;
    	if(dp[i][j].second.first==i-1 && dp[i][j].second.second==j-1){
    		ans+=s2[j-1];
    		i--;
    		j--;
    	}else if(dp[i][j].second.first==i-1){
    		i--;
    	}else{
    		j--;
    	}
    }

    reverse(ans.begin(), ans.end());
	cout<<ans;
	return 0;
}