AtCoder Regular Contest 100 F - Colorful Sequences
解法
「全ての列についてのに一致する連続する部分列の個数の総和」から「カラフルでない列についてのに一致する連続する部分列の個数の総和」を引く方針で考えます。前者は簡単なので省略します。後者はがカラフルな場合はなので、以下カラフルでないものとします。
まず次のDPを考えます。
ある特定の長さのdistinctな列の後に、個の要素を繋げてできるカラフルな列の個数
次が成り立ちます。
ただし、このDPを初期化するには、が分かっていないといけません。そこで、
ある特定の項の後に、個の要素を繋げてできるカラフルな列であって、distinctなsuffixの最大長さがであるものの数
というものを考えれば、
と遷移が定義できることがわかります。です。これらのDPはいずれも累積和で高速化できます。
さて、以上を使って「カラフルでない列についてのに一致する連続する部分列の個数の総和」を求めていきましょう。
がdistinctな場合。数列中に長さのdistinctな列が登場する場合の数は、終了位置をと固定すれば、です。その中に、はちょうどの割合で存在します。あとはをからまで動かして総和をとればよいです。
がdistinctでない場合。のdistinctなprefixの最大長さを、suffixの最大長さをとすると、数列中にが登場する場合の数は、開始位置をと固定すれば、になります。あとはをからまで動かして総和をとればよいです。
計算量は全体でになります。
反省
5日かかりました。難しかった。
コンテスト中のACが少ない問題はなかなか解けなくても自己嫌悪に陥らないので良いです。(にしても5日はかかりすぎか)
の遷移を立てるまでにかなりの苦労がありました。しかも蓋を開けてみたら非想定解でした。想定解の方が数倍賢い。