ARC058-F 文字列大好きいろはちゃん
公式解説とは違うやり方れふ.
では余裕っ(素振り)
解法
]:文字の, 辞書順最小の文字列を作るとして, 最後に使う文字列のインデックス(複数ある場合, 最小のもの)
これを順に求め, 最後に復元しまふ.
]からの遷移としてvalidなものは, 次の条件を満たすものれふ.
- 使う文字列のインデックスが]より大きい
- その遷移をした結果, 長さの文字列が作れなくなるということが無い
- 他のvalidな遷移に対応する文字列と比較して, その遷移によって生成される文字列が辞書順で大きくなってしまわない
2に違反する遷移は, あらかじめ部分和DPをしておけば検出できまふ.
3に違反する例を挙げまふ.
,
この時, となりまふが, そこからなどとする遷移はinvalidれふ.
(に対しては辞書順で大きいため)
このような遷移を弾くには, この例におけるのように, 辞書順最小の可能性のある文字列のうち最も先まで文字を確定させている文字列を記憶し, 比較する必要がありまふ.
また, 次のようなケースがありまふ.
,
このようなケースでは, を求めた瞬間に, から求めたがinvalidになりまふ. 辞書順最小の可能性のある文字列のうち最も先まで文字を確定させている文字列がからに更新され, それ以前に求めた遷移が正しいと限らなくなった形れふ. このようなケースは, を求めた直後に以降をかけて潰せば良いれふ.
以上の解法を実現するためには, 文字列の文字目以降と文字列の文字目以降に対し, 先頭から何文字共通しているかや, 辞書順でどちらが小さいかを高速に求める必要がありまふ. これらは, Suffix Array, およびそのLCPを求めてやればで達成できまふ.
参考
提出コード
終わりに
金diffれふが, 時間をいくらでもかけてよければ通しやすいタイプ……?