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<int, int> pii;

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

	string s, t; cin >> s >> t;

	vector<vector<int>> lcs(s.length() + 1, vector<int>(t.length() + 1));
	vector<vector<int>> dir(s.length() + 1, vector<int>(t.length() + 1));

	for(int i = 1; i <= s.length(); ++i)
		for(int j = 1; j <= t.length(); ++j)
		{
			if(s[i - 1] == t[j - 1]) lcs[i][j] = lcs[i - 1][j - 1] + 1, dir[i][j] = 1;
			else if(lcs[i - 1][j] > lcs[i][j - 1]) lcs[i][j] = lcs[i - 1][j], dir[i][j] = 2;
			else lcs[i][j] = lcs[i][j - 1], dir[i][j] = 3;
		}

	string ans = "";
	int x = s.length(), y = t.length();
	while(x > 0 && y > 0)
	{
		switch(dir[x][y])
		{
			case 1:
				--x, --y, ans += s[x];
				break;
			case 2:
				--x;
				break;
			case 3:
				--y;
				break;
		}
	}

	reverse(ans.begin(), ans.end());
	cout << ans << endl;

	return 0;
}