标签:
#include<cstdio> const int N=400005; int n,ans=0; int v[N]; int ls[N],rs[N]; int lm[N],rm[N]; struct node{ node*ch[2]; node(){ ch[0]=ch[1]=0; } }; node ns[64*N]; int np=0; inline node*new_node(){ return ns+np++; } struct trie{ node*rt; trie(){ rt=new_node(); } void insert(int x){ node*w=rt; for(int i=30;i>=0;i--){ int a=x>>i&1; if(w->ch[a])w=w->ch[a]; else w=w->ch[a]=new_node(); } } int max(int x){ int v=0; node*w=rt; for(int i=30;i>=0;i--){ int a=(x>>i&1)^1; if(w->ch[a])w=w->ch[a],v|=a<<i; else w=w->ch[a^1],v|=(a^1)<<i; } return v^x; } }; trie tr; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",v+i); ls[i]=ls[i-1]^v[i]; } for(int i=n;i>=1;i--)rs[i]=rs[i+1]^v[i]; for(int i=1;i<n;i++){ tr.insert(rs[i]); lm[i]=tr.max(rs[i+1]); } tr=trie(); for(int i=n;i>1;i--){ tr.insert(ls[i]); rm[i]=tr.max(ls[i-1]); } for(int i=2;i<n;i++){ if(lm[i]<lm[i-1])lm[i]=lm[i-1]; } for(int i=n-1;i>1;i--){ if(rm[i]<rm[i+1])rm[i]=rm[i+1]; } for(int i=1;i<n;i++){ if(lm[i]+rm[i+1]>ans)ans=lm[i]+rm[i+1]; } printf("%d",ans); return 0; }
标签:
原文地址:http://www.cnblogs.com/ccz181078/p/5185580.html