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 Go (1.14.1) (judge verdict: Accepted)

package main

import "fmt"

var A, B string
var dp [][]int

func max(a, b int) int {
	if a > b { return a }
	return b
}

func lcs(m, n int) int {
	dp = make([][]int, m+1)
	dp[0] = make([]int, n+1)
	for i:=1; i<m+1; i++  {
		dp[i] = make([]int, n+1)
		for j:=1; j<n+1; j++ {
			if A[i-1] == B[j-1] {
				dp[i][j] = dp[i-1][j-1] + 1
			} else {
				dp[i][j] = max(dp[i-1][j], dp[i][j-1])
			}
		}
	}
	return dp[m][n]
}

func main() {
	_, e := fmt.Scanf("%s", &A)
	if e != nil { return }
	_, e = fmt.Scanf("%s", &B)
	if e != nil { return }
	m,n := len(A), len(B)
	l := lcs(m, n)
	if l == 0 {
		fmt.Println("")
		return
	}
	s := make([]rune, 0)
	i,j := m, n
	for i > 0 && j > 0 {
		if A[i-1] == B[j-1] {
			s = append([]rune{rune(A[i-1])}, s...)
			i--
			j--
		} else if dp[i-1][j] > dp[i][j-1] {
			i--
		} else {
			j--
		}
	}
	fmt.Println(string(s))
}