思路:思维题。开始我题没读明白,以为是用线性基来做,而这题其实是利用&运算的性质来做。一般的,越多数字进行&操作,其结果只会不变,或者越来越小

因此要得到最大&值,我们有两种情况可以讨论:1.先用异或把所有数字给异或起来,最终得到只有一个数字,他可能是最大了;2.用异或把前半段变成一个数字,再把剩下的后半段变成一个数字,此时就是两个数字进行&操作,他们可能得到最大值。再接下来的3,4,5,6....个数字进行&操作,只会得到不变,或者更小的结果,就不再需要考虑了

那如何快速处理多个连续数字的异或和?当然是使用前后缀和来解决。从实现上来说,我们先算整个数组的前缀和,然后定义一个后缀和变量,边算后缀和边更新答案。这样比单独算出前缀和、后缀和之后,再遍历找答案要少一次遍历,速度更快。最后,直接输出结果即可

代码:

import sys
input = lambda: sys.stdin.readline().strip()

import math
inf = 10 ** 18

def I():
    return input()

def II():
    return int(input())

def MII():
    return map(int, input().split())

def GMI():
    return map(lambda x: int(x) - 1, input().split())

def LI():
    return input().split()

def LII():
    return list(map(int, input().split()))

def LFI():
    return list(map(float, input().split()))

fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))

'''

'''

def solve():
    n = II()
    a = LII()

    pre = [0] * (n + 1)
    for i, x in enumerate(a):
        pre[i + 1] = pre[i] ^ x

    ans = pre[-1]
    suf = 0
    for i in range(n - 1, -1, -1):
        suf ^= a[i]
        ans = fmax(ans, pre[i] & suf)
    print(ans)

# t = 1
t = II()
for _ in range(t):
    solve()