BZOJ 4260 trie树
思路:
搞一个前缀异或和
一次从左往右 另一次从右往左 异或最大值
用字典树搞一搞
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 400500
int n,a[N],cnt=1,ch[N*20][2],sum[N],lmax[N],rmax[N],ans;bool f;
void insert(int x){
int now=1;
for(int i=30;~i;i--){
f=x&(1<<i);
if(!ch[now][f])ch[now][f]=++cnt;
now=ch[now][f];
}
}
int query(int x){
int now=1,temp=0;
for(int i=30;~i;i--){
f=x&(1<<i);
if(ch[now][!f])temp+=(1<<i),now=ch[now][!f];
else now=ch[now][f];
}return temp;
}
int main(){
scanf("%d",&n);
insert(0);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]^a[i];
lmax[i]=max(lmax[i-1],query(sum[i]));
insert(sum[i]);
}
cnt=1,memset(ch,0,sizeof(ch));
for(int i=n;i;i--){
sum[i]=sum[i+1]^a[i];
rmax[i]=max(rmax[i+1],query(sum[i]));
ans=max(ans,rmax[i+1]+lmax[i]);
insert(sum[i]);
}
printf("%d\n",ans);
}