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<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define ran 3033

char s[ran], t[ran];
int slen, tlen;
int dp[ran][ran];
char ans[ran];
int la;

int main() {
	scanf("%s%s", s, t);
	slen = strlen(s);
	tlen = strlen(t);
	
	for(int i=1;i<=slen;i++)
		for(int j=1;j<=tlen;j++) {
			dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
			if (s[i-1] == t[j-1])
				dp[i][j] = max(dp[i][j], dp[i-1][j-1]+1);
		}
	int x = slen, y = tlen;
	la=0;
	while(x>0 && y>0) {
		if (dp[x][y] == dp[x-1][y]) x--;
		else 
		if (dp[x][y] == dp[x][y-1]) y--;
		else {
			ans[la++] = s[x-1];
			x--; y--;
		}
	}
	for(int i=la-1;i>=0;i--)
		putchar(ans[i]);
	puts("");
	
	return 0;
}