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

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)
    if(s(i:i)==t(j:j))then
      DP(i,j)=DP(i-1,j-1)+1
    else
      DP(i,j)=max(DP(i-1,j),DP(i,j-1))
    endif
  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)// trim(ans)
    i=i-1
    j=j-1
  end if
  if(DP(i,j)==0)exit
end do

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