for (intt=0; t < T; t++) { st = newStringTokenizer(br.readLine()); intn= Integer.parseInt(st.nextToken()); intx= Integer.parseInt(st.nextToken());
int[] a = newint[n]; st = newStringTokenizer(br.readLine()); longtotal=0; for (inti=0; i < n; i++) { a[i] = Integer.parseInt(st.nextToken()); total += a[i]; }
// 计算每个位置翻转的增益 delta = (a ^ x) - a longS=0; // 正增益总和 intcountPositive=0; intminPositive= Integer.MAX_VALUE; // 正增益中最小的 intmaxNonPositive= Integer.MIN_VALUE; // 非正增益中最大的 for (inti=0; i < n; i++) { intxorVal= a[i] ^ x; intdelta= xorVal - a[i]; if (delta > 0) { S += delta; countPositive++; minPositive = Math.min(minPositive, delta); } else { maxNonPositive = Math.max(maxNonPositive, delta); } }
longextra=0; if (countPositive % 2 == 0) { // 如果正增益个数为偶数,直接选择所有正增益 extra = S; } else { // 正增益个数为奇数,必须调整 longoptionA= S - minPositive; // 舍弃正增益中最小的 longoptionB= Long.MIN_VALUE; if (maxNonPositive != Integer.MIN_VALUE) { // 如果存在非正增益,则可以考虑额外选一个非正增益 optionB = S + maxNonPositive; } extra = Math.max(optionA, optionB); // 如果调整后增益为负,则不进行任何翻转 extra = Math.max(extra, 0); } longans= total + extra; sb.append(ans).append("\n"); } System.out.print(sb); } }