解説放送を見て道筋は理解できたが、そこからが長かった。 比較的実装が重い問題だと思う。
答えの回文LR
を文字列L
と文字列R
に分けて考える。どちらも空文字列で初期化しておく。
$s_i$を追加するときは、L
の右側に追加するか、あるいはR
の左側に追加する。
何度か$s_i$を追加して、L="abcde"
、R="cba"
となったとする。
このとき部分文字列 abc
はすでに回文の条件を満たすのでL="abc"
、R=""
と見なしてもよいということになる。
なので、L
とR
の組 (L, R)
を頂点として、ダイクストラ法を適用していけばよい。
L
やR
として現れるのは$s_i$のPrefixとSuffixのみなので、今回の制約では十分間に合う。
頂点 (L, R)
からの遷移については、すべての$s_i$について、$s_i$をL
あるいはR
に追加したときに部分的に回文の条件を満たすかどうかをチェックする。条件を満たす場合には、次の頂点に遷移できる。