AT274の技術だったりなかったり

あっとのTECH LOG

競プロのこととか技術のこととか。たまに日常を書きます。

ABC E - Red Scarf

問題原文

atcoder.jp

解法

答えを、  b_1, b_2 ... b_{N} とする。

 a_1 ⊕ a_2 ⊕ a_3 ⊕ a_4 = (b_2 ⊕ b_3 ⊕ b_4) ⊕ (b_1 ⊕ b_3 ⊕ b_4) ⊕ (b_1 ⊕ b_2 ⊕ b_4) ⊕ (b_1 ⊕ b_2 ⊕ b_3)

両辺に  a_1 = (b_2 ⊕ b_3 ⊕ b_4) をかけると、  a_1 ⊕ (a_1 ⊕ a_2 ⊕ a_3 ⊕ a_4) = b_1 になる。
これは、 N が偶数なことより、右辺で各  b_i が 奇数回あらわれるため。

これは一般化できるので、  S =  a_1 ⊕ a_2 ⊕ ... ⊕ a_N としておいて、  a_i ⊕ S を各  i について行えばよい。

 N が奇数の場合には、  a_1 ⊕ a_2 ⊕ a_3 = (b_2 ⊕ b_3) ⊕ (b_1 ⊕ b_3) ⊕ (b_1 ⊕ b_2) となる。右辺はあきらかに0なので、  a_1 ⊕ a_2 ⊕ a_3 = 0 になってないといけない。
逆にもし0ならば、そのままで条件を満たしていることになる。

実装

reduce、なるほど。

from functools import reduce
N = int(input())
A = list(map(int, input().split()))

ALL_XOR = reduce(lambda x, y: x ^ y, A)
print(*[a ^ ALL_XOR for a in A], sep=' ')

感想

本番はわちゃわちゃした結果左右から累積xorで解いてしまった。(例の黒板gcd的な)
コンテスト終わりのTLを見てたら理解できた感じがします。ありがとうございます。

ところで茶diffとはいったい。