用trie求异或最大
利用异或的性质!
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN=4e5+10;
int n,tot,num[MAXN],to[MAXN*30][2],head[MAXN],tail[MAXN];
void add(int v)
{
int now=0;
for(int i=1<<29;i;i>>=1)
{
int x=0;
if(i&v) x=1;
if(to[now][x]==0) to[now][x]=++tot;
now=to[now][x];
}
}
int q(int v)
{
int ans=0;
int now=0;
for(int i=1<<29;i;i>>=1)
{
int x=1;
if(v&i) x=0;
if(to[now][x]!=0) ans+=i,now=to[now][x];
else now=to[now][x^1];
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
int x=0;add(0);
for(int i=1;i<=n;i++)
{
x^=num[i];
add(x);
head[i]=q(x);
head[i]=max(head[i],head[i-1]);
}
memset(to,0,sizeof(to));
x=0;tot=0;add(0);
for(int i=n;i>=1;i--)
{
x^=num[i];
add(x);
tail[i]=q(x);
tail[i]=max(tail[i],tail[i+1]);
}
int ans=0;
for(int i=2;i<=n;i++) ans=max(ans,head[i-1]+tail[i]);
printf("%d",ans);
return 0;
}