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)

//package Qf
import java.util.*
import java.math.*
import java.lang.Math.*

private val readString: ()->String = {readLine()!!}
private val readInt: ()->Int = {readLine()!!.toInt()}
private val readLong: ()->Long = {readLine()!!.toLong()}
private val readIntArray: ()->IntArray = {readLine()!!.split(' ').map{it.toInt()}.toIntArray()}
private val readLongArray: ()->LongArray = {readLine()!!.split(' ').map{it.toLong()}.toLongArray()}
private val errPrintln: (String)->Unit = {msg -> System.err.println(msg)}
private val MOD = 1e9.toLong()+7
private val INF = Int.MAX_VALUE/2
private val LINF = Long.MAX_VALUE/2


fun solveF(S: String, T: String): String {
    val N = S.length
    val M = T.length
    val dp = Array(N+1){Array<String>(M+1){""}}

    for(i in 0 until N) {
        for (j in 0 until M) {
            if (T[j] == S[i]) {
                dp[i+1][j+1] = dp[i][j+1] + T[j]
            } else {
                if (dp[i][j+1].length >= dp[i+1][j].length) {
                    dp[i+1][j+1] = dp[i][j+1]
                } else {
                    dp[i+1][j+1] = dp[i+1][j]
                }
            }
        }
    }

    return dp[N][M]
}


fun main(args: Array<String>) {
    val S = readString()
    val T = readString()

    val ans = solveF(S, T)

    println(ans)
}