AtCoder Context ABC 171 E - Red Scarf

本文章为原创文章,未经过允许不得转载
运行要求
运行时间限制: 2sec
内存限制: 1024MB
原题链接

题目
小明有N只猫,N为偶数。给每个猫一个编号从1到N。每个猫给一个标牌,标牌上面写着一个非负整数。小明最近在学习异或运算xor。
XOR的定义

对于N个非负整数x1,x2,x3...xN,这些数的异或 x1 xor x2 xor x3...xor xN按照下面的方式定义

x1 xor x2 xor x3 ... xor xn,把他们用2进制表示。对应的位数上的1的个数为奇数的话,那么该位的结果为1,对应的位数的1的个数为偶数的话,该位的结果为0

小明在给猫的标牌上写数字的时候,赶快用一下刚刚学到的xor异或运算。

现在给1到N号猫另外一串特殊编号ai。

这里的ai表示,除了i号猫以外,其他的猫的标牌号的xor运算结果。

我们给定1到N号猫的特殊编号a1,a2,a3....aN

请根据ai求出,每个小猫的标牌号。

输入前提条件

  • 所有的输入均为整数
  • 2 <= N <= 200000
  • N为偶数
  • 0 <= ai <= 1000000000
  • 给出的输入都能够找到相应的输出

输入

N
a1 a2 … aN

输出
输出一行,里面包含用空格分开的N个标牌号
从左往右第i个数字代表第i只猫的标牌号
满足条件的结果由多个的话,输出任意的结果


例1
输入

4
20 11 9 24

输出

26 5 7 22

按照上面输出的标牌号,非自身以外的标牌号的xor结果,满足给定条件ai

  • 5 xor 7 xor 22 = 20
  • 26 xor 7 xor 22 = 11
  • 26 xor 5 xor 22 = 9
  • 26 xor 5 xor 7 = 24

读懂题目
xor 用^来代替

相当于给定一串数组a1,a2,a3,a4,a5.....aN
求另外一串数组b1,b2,b3,b4,b5.....bN
要求满足
a1 = b2 ^ b3 ^ b4 ... ^ bN
a2 = b1 ^ b3 ^ b4 ... ^ bN
a3 = b1 ^ b2 ^ b4 ... ^ bN
a4 = b1 ^ b2 ^ b3 ... ^ bN
...
aN = b1 ^ b2 ^ b3 ... ^ bN-1

想到于解xor的多元一次方程

解题思路

我们来看一下XOR运算的规律
AtCoder Context ABC 171 E - Red Scarf_第1张图片

如图所示 5 ^ 7 ^ 5 = 7
在等号左边的运算中5出现了2次,7出现了1次

AtCoder Context ABC 171 E - Red Scarf_第2张图片
如图所示
5 ^ 5 = 0
等号左边的5出现了2次,最后5被消掉

5 ^ 5 ^ 5 = 5
等号左边的5出现了3次,最后5被留下

上面两个例子就是,在异或运算中,当某一个元素最后出现的个数是偶数的时候,最后会被消掉,出现的次数是奇数的时候,最后该数字会被留下来
比如下面,最后只有m和t被留在了等号右边
m ^ m ^ m ^ n ^ n ^ t = m ^ t

AtCoder Context ABC 171 E - Red Scarf_第3张图片
如图所示,我们已知a1,a2,a3,...aN
如果我们把a1,a2,a3...aN一起做一个XOR运算的话,可以得到
a1 ^ a2 ^ a3 ... ^ aN = b1 ^ b2 ^ b3 ... ^ bN
因为N是偶数,bi都只出现了N-1次,N-1为奇数,所以最后它们bi都会被留下来

bi代表了i号猫标牌上的数字
我们这样就知道了所有的bi的xor结果

AtCoder Context ABC 171 E - Red Scarf_第4张图片
对于每个ai来说,ai ^ (b1 ^ b2 ^ b3 ^...bN) = bi

我们已知ai和(b1 ^ b2 ^ b3 ^...bN),就能求得bi

代码

N = 4
ARR = [20, 11, 9, 24]

N = int(input())
ARR = list(map(int, input().split()))


def calculate(n, arr):
    s = arr[0]
    for i in range(1, n):
        s = s ^ arr[i]

    result = []

    for i in range(n):
        result.append(str(arr[i] ^ s))

    print(" ".join(result))


calculate(N, ARR)

总结
这一题考察了对于XOR异或运算的理解
同一个数出现的次数为偶数将会被清洗
同一个数出现的次数为偶数将会被留下

※ 另外,我会在我的微信个人订阅号上推出一些文章,欢迎关注
二维码.jpg


你可能感兴趣的:(python3.x)