EDPC F - LCS

最長共通部分列

考え方

ABCでいうと、E問題級。

文字列 $S$ と $T$ の最長共通部分列を $1$ つ求める問題。

典型問題そのまま。
詳しくは「最長共通部分列」の記事参照。

計算量は $O(\lvert S\rvert\lvert T\rvert)$。

入力例1での動作

入力を受け取る。

s: axyb
t: abyxb

dp[i][j] を、s の先頭 $i$ 文字と t の先頭 $j$ 文字での最長共通部分列の長さとする。

DP テーブルを埋めると、次のようになる。

st "" a ab aby abyx abyxb
"" 0 0 0 0 0 0
"a" 0 1 1 1 1 1
ax 0 1 1 1 2 2
axy 0 1 1 2 2 2
axyb 0 1 2 2 2 3

最後に、右下からバックトレースする。

まず、s[3]t[4] はどちらも b なので、答えに b を追加する。
その後、s[2]t[3] は異なるので、DP テーブルの値を保てる方へ戻る。

次に、s[1]t[3] はどちらも x なので、答えに x を追加する。
その後、s[0]t[2]s[0]t[1] は異なるので、DP テーブルの値を保てる方へ戻る。

最後に、s[0]t[0] はどちらも a なので、答えに a を追加する。

この時点で、後ろから見た答えは bxa である。
これを反転した axb が答え。

注意点

特になし。

別解

特になし。