geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

ABC237 参加記録

コンテスト中AC:A〜E
Eは嘘解法(Cも若干そうでしたが)だったので、ここでは省略します。

C - kasaka

先頭から連続しているaの個数をhead、末尾から連続しているaの個数をtailとします。
先頭に付け加えるのに必要な個数は、tail - headです。この分だけ付け加えて回文かどうかを判定することで答えを得られます。

参加記録を書くにあたって、実装を見直したところ、何故か末尾の方が少なかった場合に、末尾にもaを追加する実装になっていました(嘘解法でした)。ただ、付け加える個数をtail - headのままにしていたのでACとなっていました。

提出コードは、正しい解法で書き直したものです。
提出コード

D - LR insertion

双方向連結リストにより、挿入操作をO(1)でできます。
FD[i]:数列Aにおいて、iの後にある整数
BK[i]:数列Aにおいて、iの前にある整数
但し、前または後に何もなければ-1とします。

各挿入操作は以下のようになります。

  • S_i = Lの場合

    • iの前はi-1なので、FD[i] \leftarrow i-1
    • i-1の後ろはiとなるので、BK[i-1] \leftarrow i
    • i-1の後ろにあったものがiの後ろとなるので、BK[i] \leftarrow BK[i-1]
    • i-1の後ろに整数xがある場合(BK[i-1] \neq -1)、xの前はiとなるので、FD[x] \leftarrow i
  • S_i = Rの場合

    • i-1の前はiとなるので、FD[i-1] \leftarrow i
    • iの後ろはi-1となるので、BK[i] \leftarrow i-1
    • i-1の前にあったものがiの前となるので、FD[i] \leftarrow FD[i-1]
    • i-1の前に整数xがある場合(FD[i-1] \neq -1)、xの後ろはiとなるので、BK[x] \leftarrow i

答えの列は、BKを辿って先頭まで行き、FDを辿って末尾まで行くことで、得ることができます。
提出コード