ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

第5回 ドワンゴからの挑戦状 予選 C - k-DMC

問題
提出コード
WAしていたコードの冗長な部分をコンパクトに書き直していたら、バグが消えていたのに提出しなかったので、結局時間内にACすることができませんでした…パフォが400ほど変わるのでめちゃくちゃ悔しいです。知らぬ間にバグが消えていたパターンの対処法、募集します。

解法

まずは真ん中、つまりMに注目しますが、うまくいきそうになかったので今度はCに注目します。
Cを使う場所を決めたときにできる、DMの組み合わせの個数が求まれば、この問題を解くことができます。
前から見ていったときに、今見ている文字がMだったら、その時点で使用できるDの個数を追加し、K文字前がDだったら、それ以降はそのDを使用できなくなるので、K文字の区間にあるMの個数を引きます。こうすることで、ある場所にいる際にできるDMの組み合わせの数がわかります。なので、Cが見つかったら、その時点で使用できる組み合わせの数を追加していけば、答えが求まります。
ある区間に対するDMの個数が知りたいので、累積和を使えばO(1)で求めることができます。

  • S_i =Mのとき
    i - 1までのDの個数からi - kまでのDの個数を引いたものを足します。

  • S_i =Cのとき
    今使用できる組み合わせを答えに加算します。

  • S_{i-k+1} =Dのとき
    iまでのMの個数からi - k+1までのMの個数をひいたものを引けばよいです。

これを繰り返せば、答えを求めることができます。