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

fun main(args: Array<String>) {
    edpf()
}

private enum class From { LEFT, LEFT_ABOVE, ABOVE, UNDEFINED }

fun edpf() {
    val s = readLine()!!
    val t = readLine()!!

    // sをiまで、tをjまで選んだときのLCSテーブル
    val dp = Array(s.length + 1) { Array(t.length + 1) { 0 } }
    // dpテーブルでどの方向から遷移してきたか (縦軸s、横軸tとする)
    val from = Array(s.length + 1) {
        Array(t.length + 1) {
            From.UNDEFINED
        }
    }

    // LCSの遷移を記録
    for (i in 1..s.length) {
        for (j in 1..t.length) {
            dp[i][j] = if (s[i - 1] == t[j - 1]) {
                from[i][j] = From.LEFT_ABOVE
                dp[i - 1][j - 1] + 1
            } else {
                if (dp[i - 1][j] > dp[i][j - 1]) {
                    from[i][j] = From.ABOVE
                    dp[i - 1][j]
                } else {
                    from[i][j] = From.LEFT
                    dp[i][j - 1]
                }
            }
        }
    }

    val answer = StringBuffer()

    // LCSの復元
    var si = s.length
    var ti = t.length
    while (si > 0 && ti > 0) {
        when (from[si][ti]) {
            From.LEFT_ABOVE -> {
                answer.append(s[si - 1])
                si--
                ti--
            }
            From.ABOVE -> si--
            From.LEFT -> ti--
            else -> Unit
        }
    }

    println(answer.reverse())
}