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: Accepted)

open String
let () =
  Scanf.scanf " %s %s" @@ fun s t ->
  let s_len = length s in
  let t_len = length t in
  let dpl = Array.init (s_len+1) (fun _ -> Array.make (t_len+1) 0) in
  let dpp = Array.init (s_len+1) (fun _ -> Array.init (t_len+1) (fun _ -> [])) in
  for si = 0 to s_len-1 do
    for ti = 0 to t_len-1 do
      if s.[si] = t.[ti] then begin
        dpl.(si+1).(ti+1) <- dpl.(si).(ti) + 1;
        dpp.(si+1).(ti+1) <- s.[si] :: dpp.(si).(ti);
      end else
      if dpl.(si+1).(ti) > dpl.(si).(ti+1) then begin
        dpl.(si+1).(ti+1) <- dpl.(si+1).(ti);
        dpp.(si+1).(ti+1) <- dpp.(si+1).(ti);
      end else begin
        dpl.(si+1).(ti+1) <- dpl.(si).(ti+1);
        dpp.(si+1).(ti+1) <- dpp.(si).(ti+1);
      end
    done;
  done;
  dpp.(s_len).(t_len)
  |> List.rev |> List.iter print_char;
  print_newline ()