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 Fortran (gfortran v4.8.4) (judge verdict: Wrong Answer)

program main
character(3000) s,t
integer,allocatable,dimension(:,:)::DP
character(3000) ans
read*,s,t
allocate( DP(0:len_trim(s),0:len_trim(t)) )

!DP(i,j)にはSのi文字目までの部分とTのj文字目までの部分のLCSの長さが格納されています
!初期条件としてDP(0,:)=0及びDP(:,0)=0が既知です。
!一番左上に(0,0)を据えて右下に展開していくとします。
!このときある(i,j)について一つ上の値と一つ左の値を知っていたらば(i,j)を求めることが可能です。

DP=0
do i= 1, len_trim(s)
  do j= 1, len_trim(t)
    DP(i,j)=max(DP(i-1,j),DP(i,j-1)) + merge(1,0,s(i:i)==t(j:j) )
  end do
end do

!一番DPの値が高いところ(DP(len_trim(s),len_trim(t)))から1段ずつ降っていきます
ans=""
i = len_trim(s)
j = len_trim(t)
do
  if( DP(i,j)==DP(i-1,j) )then
    i=i-1
  else if( DP(i,j)==DP(i,j-1) )then
    j=j-1
  else
    ans = s(i:i)// ans
    i=i-1
    j=j-1
  end if
  if(DP(i,j)==0)exit
end do

print"(A)",trim(ans)
end program main