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 <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <stack>
#include <string>
#include <ctime>
#include <iomanip>
#include <set>
#include <iterator>
#include <map>
using namespace std;

#define pb push_back

#define forn(i, n) for(int i = 0; i < (int)(n); i++)
#define for1(i, n) for(int i = 1; i <= (int)(n); i++)

using ll = long long;

typedef vector<int> vi;

const int INF = 1e9 + 5;

void max_self(ll& a, ll b)
{
	a = max(a, b);
}

void max_self(int& a, int b)
{
	a = max(a, b);
}

int main()
{
	string a, b;
	cin >> a >> b;
	vector<vector<int>> dp(a.length() + 1, vector<int>(b.length() + 1, 0));
	for(int i = 0; i < a.length(); i++)
		for (int j = 0; j < b.length(); j++)
		{
			if (a[i] == b[j])
				max_self(dp[i + 1][j + 1], dp[i][j] + 1);
			max_self(dp[i + 1][j], dp[i][j]);
			max_self(dp[i][j + 1], dp[i][j]);
		}
	int size = 0;
	for (auto row : dp)
		for (auto v : row)
			max_self(size, v);
	vector<char> ans(size);
	if (size != 0)
	{
		int i = a.length(), j = b.length();
		while (i > 0 && j > 0)
		{
			if (a[i - 1] == b[j - 1])
			{
				ans[size - 1] = a[i - 1];
				i--, j--, size--;
			}
			else if (dp[i - 1][j] > dp[i][j - 1])
				i--;
			else j--;
		}
		for (auto i : ans)
			cout << i;
	}
	else cout << " " << endl;
	return 0;
}