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);
}

这里写图片描述

posted @ 2017-01-12 17:54  SiriusRen  阅读(113)  评论(0编辑  收藏  举报