最初、位置ではなくゴーレムにアルファベットが振られている問題と読み間違えてしまい、すべて実装し終わってサンプルでテストするまで気づかなかった(30分ロス)。誤読することがあるのは仕方ないけれど、最初にサンプルをシミュレーションすれば気づけたはず。
考察は基本原則に従った: AとBを同時に処理しなければならない場合はまず、Aだけで良いとしたら?と考える。今回の場合、LとRが混在することで逆に問題が簡単になるというのは明らかにありえないので、まず片方だけの場合について解けなければどうしようもないと思える。
呪文がRしかない場合について、サンプルのAABCBDBAを例にとって考える。初期位置のゴーレムが(右に)消滅するのはそれぞれ呪文の部分列に
- A, A, B, C, B, D, B, A
- A, B, C, B, D, B, A
- B, C, B, D, B, A
- C, B, D, B, A
- B, D, B, A
- D, B, A
- B, A
- A
が含まれている場合だが、これらを素朴に1つずつチェックしていくとになってしまう。しかし、例えば呪文の部分列にB, D, B, Aが含まれれば当然D, B, Aも含まれるので二分探索して境界を探せばですむ。
こうなると、呪文にLとRが混在する場合も二分探索でできるのでは?と考えたくなるが、できる。ゴーレムが他のゴーレムを追い越すことはないので、初期位置のゴーレムが右に消えるなら初期位置のゴーレムも消えるし、左に消えればのゴーレムも左に消える。したがって、なるがすべて左に消滅するような最大のと、なるがすべて右に消滅するような最小のを二分探索で求めると、答えはである。
いきなり太字の核心部分に気づけるほうが頭いい感じだけど、気づかなくても解けるようになったのは進歩だと思うことにする。