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)


// F - LCS (Longest Common Subsequence)

// 最長共通部分文字列の長さだけでなく、部分文字列そのものを求める


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// const int INF = 2147483647;
// const ll INF = 9223372036854775807;
// const int MOD = 1e9 + 7;

int dp[3001][3001]; // dp[i][j]: sのi文字目, tのj文字目（1始まり）までのLCS
string s, t;

void update(int i, int j) {
	if (s[i] == t[j]) {
		dp[i][j] = dp[i-1][j-1] + 1;
	} else {
		dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
	}
}

int main(){
	cin >> s >> t;
	int m = s.size();
	int n = t.size();

	s = " " + s;
	t = " " + t;

	for (int i=1; i<=m; i++) {
		for (int j=1; j<=n; j++) {
			update(i, j);
		}
	}

	// 復元
	string ans = "";
	int i = m;
	int j = n;
	while(i>0 && j>0) {
		if (dp[i][j] == dp[i-1][j]) { // dp[i-1][j]からの遷移
			i--;
		} else if (dp[i][j] == dp[i][j-1]) { // dp[i][j-1]からの遷移
			j--;
		} else { // dp[i-1][j-1]からの遷移
			ans = s[i] + ans;
			i--;
			j--;
		}
	}

	cout << ans << endl;

	return 0;
}