EDPC F - LCS

最長共通部分列

考え方

ABCでいうと、E問題級。

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

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

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

入力例1での動作

入力を受け取る。

s: axyb
t: abyxb

$S$ と $T$ の各接頭辞について考える。
各組の最長共通部分列の長さを求める。
表を埋めると次のようになる。

$S$ \ $T$ 空文字 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

右下から表を逆向きにたどり、実際の最長共通部分列を復元する。

まず、axyb と abyxb を見る。
末尾はどちらも b なので、b を採用する。
両方の末尾を取り除き、axy と abyx へ移る。

末尾の y と x は異なる。
axy の末尾を取り除いても、長さ $2$ を保てる。
そのため、ax と abyx の組へ移る。

この組では、末尾がどちらも x である。
x を採用して、両方の末尾を取り除く。
次は a と aby を見る。

末尾の a と y は異なる。
aby の末尾を取り除いても、長さ $1$ を保てる。
そのため、a と ab の組へ移る。
同様に、a と a の組まで移る。

最後は、末尾がどちらも a である。
a を採用する。

逆向きに採用した文字列は bxa となる。
これを反転した axb が答え。

注意点

特になし。

別解

特になし。