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: Wrong Answer)

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll N=5005;
int main(){
	ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0);
	ll i,j,dp[N][N],n,m;
	string ans="",a,b;
	fflush(stdin); cin>>a; n=a.size();
	fflush(stdin); cin>>b; m=b.size();
	for(i=0;i<n;++i){
		if(a[i]==b[0]){
			for(j=i;j<n;++j) dp[j][0]=1;
			break;
		}
		else dp[i][0]=0;
	}
	for(i=0;i<m;++i){
		if(b[i]==a[0]){
			for(j=i;j<m;++j) dp[0][j]=1;
			break;
		}
		else dp[0][i]=0;
	}
	for(i=1;i<n;++i){
		for(j=1;j<m;++j){
			if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;
			else dp[i][j]=min(dp[i-1][j],dp[i][j-1]);
		}
	}
//	for(i=0;i<n;++i){
//		for(j=0;j<m;++j) cout<<dp[i][j]<<" ";
//		cout<<endl;
//	}
	i=n-1; j=m-1;
	while((i>=0)&&(j>=0)){
		if(a[i]==b[j]){
			ans+=a[i];
			--i; --j;
			continue;
		}
		if(i==0){
			--j;
			continue;
		}
		if(j==0){
			--i;
			continue;
		}
		if(dp[i-1][j]>dp[i][j-1]) --i;
		else --j;
	}
	reverse(ans.begin(),ans.end());
	cout<<ans;
}