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

let memoize n f =
  let dp = Hashtbl.create n in
  let rec get x =
    try Hashtbl.find dp x with
    | Not_found ->
        let result = f get x in
        Hashtbl.add dp x result;
        result in get

let () =
  let s = read_line () in
  let t = read_line () in
  let dp = memoize (String.length s * String.length t) @@ fun dp -> function
    | (-1, _) -> (0, [])
    | (_, -1) -> (0, [])
    | (i, j) ->
        if s.[i] = t.[j] then
          let (l, cs) = dp (i - 1, j - 1) in
          (l + 1, s.[i] :: cs)
        else
          let (l, cs) = dp (i, j - 1) in
          let (l', cs') = dp (i - 1, j) in
          if l <= l' then (l', cs') else (l, cs) in
  (List.iter print_char @@ List.rev @@ snd @@ dp (String.length s - 1, String.length t - 1));
  print_newline ()