classXorBasis: def__init__(self, W=31): self.W = W # 支持到 2^W self.basis = [0] * (W + 1) # basis[k] 存放最高位为 k 的基向量
definsert_basis(self, x: int) -> None: """ 将整数 x 插入线性基。 """ for k inrange(self.W, -1, -1): ifnot ((x >> k) & 1): continue ifself.basis[k] == 0: # 找到空位,x 成为新的基向量 self.basis[k] = x return # 否则,用已有基消去 x 在第 k 位的 1 x ^= self.basis[k] # 若 x 最终变为 0,则表示它是冗余的,无需插入
defget_max_xor(self) -> int: """ 在已插入的数中,选子集求最大异或和。 """ res = 0 for k inrange(self.W, -1, -1): # 若使用 basis[k] 能提升结果,就异或它 if (res ^ self.basis[k]) > res: res ^= self.basis[k] return res
full = (1 << n) - 1 OR_all = reduce(or_, nums) bitlen = OR_all.bit_length() full_bits_mask = (1 << bitlen) - 1 ans = 0 for B inrange(1 << n): R = full ^ B XR = xor_mask[R] Z = full_bits_mask ^ XR vs = [(nums[i] & Z) for i inrange(n) if (R >> i) & 1] basis = XorBasis(bitlen)
for v in vs: basis.insert_basis(v)
M = basis.get_max_xor() acb = XR + 2 * M + and_mask[B] ans = max(ans, acb) return ans