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 Rust (1.15.1) (judge verdict: Accepted)

use std::io::*;
use std::str::FromStr;

fn read<T: FromStr>() -> T {
    let stdin = stdin();
    let stdin = stdin.lock();
    let token: String = stdin
        .bytes()
        .map(|c| c.expect("failed to read char") as char) 
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .collect();
    token.parse().ok().expect("failed to parse token")
}

fn main() {
    let s: String = read();
    let t: String = read();

    let si: Vec<char> = s.chars().collect();
    let ti: Vec<char> = t.chars().collect();

    let mut dp = vec![vec!["".to_string(); t.len()+1]; s.len()+1];

    // s の i 番目の文字まで考えて、t の j番目の文字までの中での部分文字列の長さを最大化
    for i in 0..si.len() {
        for j in 0..ti.len() {
            dp[i+1][j+1] = dp[i][j+1].clone();
            if si[i] == ti[j] {
                if dp[i][j].len() + 1 > dp[i+1][j+1].len(){
                    let mut s_new2 = dp[i][j].clone();
                    s_new2.push(si[i]);
                    dp[i+1][j+1] = s_new2;
                }
            }
            if dp[i+1][j].len() > dp[i+1][j+1].len() {
                dp[i+1][j+1] = dp[i+1][j].clone();
            }
            dp[i][j] = "".to_string();
            // println!("{} {} {}", i+1, j+1, dp[i+1][j+1]);
        }
    }

    println!("{}", dp[si.len()][ti.len()]);
}