题解思路可以移步大佬写的文章:
https://blog.csdn.net/m0_49924838/article/details/122796494 跳转
这里将代码改成java,已通过全部测试用例:
import java.util.Arrays;
import java.util.Scanner;
class Main {
static int[] num = new int[22]; // 记录每位的1的个数
public static void pre(int x) {
int cnt = 1;
while (x != 0) {
if ((x & 1) != 0)
num[cnt]++;
x >>= 1;
cnt++;
}
}
public static void main(String[] args) {
int T; // 询问数
int n, res, x; // res存储xi元素异或结果
Scanner in = new Scanner(System.in);
T = in.nextInt();
while (T-- != 0) {
Arrays.fill(num, 0);
res = 0;
n = in.nextInt();
for (int i = 0; i < n; i++) {
x = in.nextInt();
pre(x);
// 异或
res ^= x;
}
if (res == 0) {
// 平局
System.out.println("0");
} else {
for (int k = 20; k > 0; k--) {
if (num[k] == 1) {
System.out.println("1");
break;
}
// 1的个数是奇数
if (num[k] % 2 == 1) {
if (n % 2 == 0) {
// 1是奇数,n是偶数,那么0是奇数,只要后手把0先选完,后手就获得最后一个1的支配权,后手胜
System.out.println("-1");
break;
} else {
// 同理可得,n是奇数,0是偶数,先手把0先选完,先手获得最后一个1的支配权,先手胜利
System.out.println("1");
break;
}
}
}
}
}
}
}