loj 10050 连续子段最大异或和

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)

using namespace std;
const int N=3200050;

int ch[N][32],a[N];
int tot,n,ans;

inline void insert(int x){
    int u=0;
    for(int k=30;k>=0;k--){
        int c=(x>>k)&1;
        if(!ch[u][c]) ch[u][c]=++tot;
        u=ch[u][c];
    }
}
inline int query(int x){
    int u=0,v=0,ans=0;
    for(int k=30;k>=0;k--){
        int c=(x>>k)&1,o=c?0:1;
        if(ch[v][o]) v=ch[v][o],ans=(ans<<1)|1;
        else v=ch[v][c],ans<<=1;
        u=ch[u][c];
    }return ans;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),insert(a[i]);
    for(int i=1;i<=n;i++)
    ans=max(ans,query(a[i]));
    printf("%d\n",ans);return 0;
}

 

posted @ 2018-09-20 11:22  ASDIC减除  阅读(702)  评论(0编辑  收藏  举报