ツバサの備忘録

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

CPSCO2019 Session3 E - Enumerate Xor Sum

問題
提出コード

解法

kのときの答えを求めてみます。
Xについては、A_{i}の累積xorをとっておくことでO(1)で求めることができるので割愛します。
A_{i}Xのxorを取った値をYとすると、xorの定義から、それぞれの桁について、A_{i},Xの立ってるビットの個数が1ならばYのその桁は1、そうでなければ0となります。
Xについて立っているビットは最初から決まっているので、A_{i}について、それぞれの桁で立っているビット、立っていないビットの個数が全部で何個あればいいか、というのがわかればよいことになります。
ということは、A_{1}からA_{k}までのそれぞれのビットについて、立っている個数と立っていない個数を調べれば、Xのビットによって場合分けをして、2^{p}を表すビットの部分はA_{1} xor X +... + A_{k} xor X全体で何回足されるか、というのが計算できるようになります。

感想

桁でわける、という典型を思い出したらすんなり解けたのでよかったです。 実装もバグらせなかった(記憶)ので満足かなと思います