ビット列を部分的に反転させたり、立っているビットを数えたりする問題。セグメント木などで解ける典型問題1だが、くらいなので、愚直シミュレーションをワードサイズ高速化しても十分間に合いそう。ANSI CLには十分な機能がないので、実装して通した。
その後でSBCLのソースを眺めていると、どうやらcount
にはsimple-bit-vector
用のトランスフォームが定義されているらしい。これなら自分の実装はいらなかったなと思ったが、コードをよく見ると、引数にstart
とend
がなく、ベクタ全体を数える場合にだけ適用されるdeftransform
だった。範囲指定がある場合は通常通り1ビットずつ数えるので、まったく間に合わないようだ。
あと、logcount
がpopcntになるのはバージョン1.2.8以降らしい。AtCoder以外のコンテストサイトのSBCLは確認できる限りすべて1.3.0以降なので、AtCoderのSBCLが新しくなれば考慮する必要がなくなりそう。