問題概要
問題ページ
-
-
E - Red Scarf
問題ページへ移動する
問題文
猫のすぬけくんが N (\textbf{偶数}) 匹います。各すぬけくんには 1, 2, \ldots, N の番号が振られています。
各すぬけくんは首に赤いスカーフを巻いており、スカーフにはそのすぬけくんが一番好きな非負整数が 1 つ書き込まれています。
すぬけくんたちは最近、整数の xor(排他的論理和)と呼ばれる演算を覚えました。
xor とは
n 個の非負整数 x_1,x_2, \ldots, x_n について、それらの xor、 x_1~\textrm{xor}~x_2~\textrm{xor}~\ldots~\textrm{xor}~x_n は以下のように定義されます。
- x_1~\textrm{xor}~x_2~\textrm{xor}~\ldots~\textrm{xor}~x_n を二進表記した際の 2^k(k \geq 0) の位の数は、x_1,x_2, \ldots, x_n のうち、二進表記した際の 2^k(k \geq 0) の位の数が 1 となるものの個数が奇数ならば 1、そうでなければ 0 となる。
例えば、3~\textrm{xor}~5 = 6 となります。
早速この演算を使いたくなったすぬけくんたちは、自分以外のすぬけくんのスカーフに書かれた整数の xor を計算することにしました。
番号 i が振られたすぬけくんが計算した、自分以外のすぬけくんのスカーフに書かれた整数の xor が a_i であることが分かっています。
この情報を元に、各すぬけくんのスカーフに書かれた整数を特定してください。
制約
- 入力はすべて整数である
- 2 \leq N \leq 200000
- N は\textbf{偶数}
- 0 \leq a_i \leq 10^9
- 与えられた情報と整合するようなスカーフ上の整数の組合せが存在する
問題の考察
ACコード
import sys def solve(): input = sys.stdin.readline mod = 10 ** 9 + 7 n = int(input().rstrip('\n')) a = list(map(int, input().rstrip('\n').split())) bs = 0 for v in a: bs ^= v ls = [] for v in a: bs ^= v ls.append(bs) bs ^= v print(*ls) if __name__ == '__main__': solve()