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 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX     3333
char s[MAX], t[MAX];
int dp[MAX][MAX];

int max(int x, int y) {
    return (x > y) ? x : y;
}

int main() {
    scanf("%s", s);
    scanf("%s", t);
    int i, j;
    char *sub = malloc(sizeof(char) * MAX);
    sub += MAX;



    for (i = 0; i < strlen(s); i++) {
        for (j = 0; j < strlen(t); j++) {
            //printf("%d\n", (s[i] == t[j]));
            if (i == 0 && j == 0) dp[i][j] = (s[i] == t[j]);
            else if (i == 0) dp[i][j] = (s[i] == t[j]) ? 1 : dp[i][j - 1]; 
            else if (j == 0) dp[i][j] = (s[i] == t[j]) ? 1 : dp[i - 1][j];
            else dp[i][j] = (s[i] == t[j]) ? dp[i - 1][j - 1] + 1 : max(dp[i - 1][j - 1], max(dp[i - 1][j], dp[i][j - 1]));
            //printf("%d ", dp[i][j]);
        }
        //putchar('\n');

    }

    i--;
    j--;

    while (i >= 0 && j >= 0) {
        if (s[i] == t[j]) {
            *sub-- = s[i];
            i--;
            j--;
        } 
        else if (i == 0 && j == 0) break;
        else if (i == 0) j--;
        else if (j == 0) i--;
        else if (dp[i - 1][j] > dp[i][j - 1]) i--;
        else j--;
    }

    printf("%s\n", sub + 1);

    //printf("%d\n", dp[i - 1][j - 1]);

}