看见题目范围,可知暴力解法不行,本代码还有待改进(没过200000)
建立字典树,不是字典建立的,使用的是列表
def insert(pre):
global idx
cur = 0
for i in range(21, -1, -1):
num = pre >> i & 1
if not ch[cur][num]:
ch[cur][num] = idx
#print(cur, num, idx,'====')
idx += 1
cur = ch[cur][num]
def find_max(pre):
cur = 0
rec = '0b'
for i in range(21, -1, -1):
num = pre >> i & 1
nee = num ^ 1
if ch[cur][nee]:
cur = ch[cur][nee]
rec += str(nee)
else:
cur = ch[cur][num]
rec += str(num)
rec = int(rec, 2)
return pre^rec
def find_min(pre):
cur = 0
rec = '0b'
for i in range(21, -1, -1):
num = pre >> i & 1
nee = num ^ 1
if ch[cur][num]:
cur = ch[cur][num]
rec += str(num)
else:
cur = ch[cur][nee]
rec += str(nee)
rec = int(rec, 2)
return pre^rec
n = int(input())
a = list(map(int,input().split()))
pre = 0
idx = 1
lmax = []
lmin = []
m = 10**6
ch = [ [None]*2 for _ in range(m) ]
insert(0)
# 前缀和
for num in a:
pre ^= num
if not lmax:
lmax.append(pre)
lmin.append(pre)
else:
lmax.append( max( lmax[-1], find_max(pre) ) )
lmin.append( min( lmin[-1], find_min(pre) ) )
insert(pre)
beh = 0
idx = 1
rmax = []
rmin = []
ch = [ [None]*2 for _ in range(m) ]
insert(0)
# 后缀和
for num in a[::-1]:
beh ^= num
if not rmax:
rmax.append(beh)
rmin.append(beh)
else:
rmax.append( max( rmax[-1], find_max(beh) ) )
rmin.append( min( rmin[-1], find_min(beh) ) )
insert(beh)
ans = 0
for k in range(n-1):
ans = max( ans, lmax[k]-rmin[-k-1], rmax[-k-1]-lmin[k])
print(ans)