BZOJ 4260 trie树

来源:互联网 发布:推理软件 编辑:程序博客网 时间:2024/06/06 07:10

思路:
搞一个前缀异或和

一次从左往右 另一次从右往左 异或最大值

用字典树搞一搞

//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 400500int 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);}

这里写图片描述

0 0