编码思路:(原代码在最后)
#先保存每一组输入
#拆分出每一组查询数,分开处理
#处理特殊情况 如1 0 或者 4 0 0 0 0等,则A,B都无法改变,直接equal
#构建一个计数数组,方便后面看1的奇数、偶数
#最大的数,的二进制位数长度
#统计所有数的二进制对应位数的1的个数
#寻找1的数量为奇数的最高位
#各二进制位上1的数量全是偶数,equal
#最高位只有一个1,或者最高位1的数量为奇数且总的数量为奇数,则A先手,A win
#最高位1的数量为奇数且总的数量为偶数,则B后手,B win
#先保存每一组输入
T = int(input())
sum = []
for i in range(T):
q = []
str1 = input()
q = [int(x) for x in str1.split(' ')]
q.pop(0)
sum.append(q)
#拆分出每一组查询数,分开处理
for y in range(T):
Maxx = 0#初始
if max(sum[y]) > Maxx:
Maxx = max(sum[y])
#处理特殊情况 如1 0 或者 4 0 0 0 0等,则A,B都无法改变,直接equal
if Maxx == 0:
print(0)
continue#直接跳到下一组询问数
#构建一个计数数组,方便后面看1的奇数、偶数
count = []
k = lenth = 0
while Maxx != 0:
k = Maxx % 2
Maxx = int(Maxx/2)
count.append(0)
lenth = lenth + 1#最大的数,的二进制位数长度
#统计所有数的二进制对应位数的1的个数
i = k = 0
for x in sum[y]:
i = 0
while x != 0:
k = x % 2
x = int(x/2)
count[i] += k
i += 1#继续
#寻找1的数量为奇数的最高位
while count[lenth - 1] % 2 == 0:
lenth = lenth - 1
if lenth == 0:
break
if lenth == 0:#各二进制位上1的数量全是偶数,equal
print(0)
elif count[lenth - 1] == 1 or len(sum[y]) % 2 != 0:
#最高位只有一个1,或者最高位1的数量为奇数且总的数量为奇数,则A先手,A win
print(1)
else:#最高位1的数量为奇数且总的数量为偶数,则B后手,B win
print(-1)
#测试用例
# 4
# 1 1
# 1 0
# 2 2 1
# 7 992438 1006399 781139 985280 4729 872779 563580
# 3
# 12 0 1 0 1 1 0 0 0 1 0 0 0
# 12 1 1 0 1 1 0 0 0 1 0 0 0
# 12 0 0 1 1 1 0 0 0 1 0 0 0
思路参考了了许多文章,这篇讲解不错:java实现的:异或数列蓝桥杯_望 望的博客-CSDN博客