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)

let () =
  let s = read_line () in
  let t = read_line () in
  let lss = Array.make_matrix (String.length s + 1) (String.length t + 1) 0 in
  let css = Array.make_matrix (String.length s + 1) (String.length t + 1) [] in
  for i = 1 to String.length s do
    for j = 1 to String.length t do
      if s.[i - 1] = t.[j - 1] then begin
        lss.(i).(j) <- 1 + lss.(i - 1).(j - 1);
        css.(i).(j) <- s.[i - 1] :: css.(i - 1).(j - 1)
      end else if lss.(i).(j - 1) <= lss.(i - 1).(j) then begin
        lss.(i).(j) <- lss.(i - 1).(j);
        css.(i).(j) <- css.(i - 1).(j)
      end else begin
        lss.(i).(j) <- lss.(i).(j - 1);
        css.(i).(j) <- css.(i).(j - 1)
      end
    done
  done;
  (List.iter print_char @@ List.rev @@ css.(String.length s).(String.length t));
  print_newline ()