[BZOJ]4260: Codechef REBXOR

题解:把前缀和丢进trie树 维护以i结尾的区间最大异或和pre[i]   把后缀和丢进tire树 维护以i起始的区间最大异或和suf[i]  然后枚举前半部分 查询后半部分最大值 我们可以通过st表来维护最大值 然后取max即可

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <set>
#include <map>
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define link(x) for(edge *j=h[x];j;j=j->next)
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int MAXN=4e5+10;
const double eps=1e-8;
#define ll long long
using namespace std;
struct edge{int t,v;edge*next;}e[MAXN<<1],*h[MAXN],*o=e;
void add(int x,int y,int vul){o->t=y;o->v=vul;o->next=h[x];h[x]=o++;}
ll read(){
    ll x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return x*f;
}

int n;
int a[MAXN];
typedef struct node{
    int ch[2];
}node;
node d[MAXN*32];
int cnt,rt;
void newnode(int &x){
    x=++cnt;d[x].ch[0]=d[x].ch[1]=0;
}

void insert(int x){
    int temp=rt;
    for(int i=30;i>=0;i--){
	if(!d[temp].ch[((x>>i)&1)])newnode(d[temp].ch[((x>>i)&1)]);
	temp=d[temp].ch[((x>>i)&1)];
    }
}

int query(int x){
    int temp=rt;int ans=0;
    for(int i=30;i>=0;i--){
	int t=((x>>i)&1);
	if(d[temp].ch[!t])ans+=(1<<i),temp=d[temp].ch[!t];
	else temp=d[temp].ch[t];
    }
    return ans;
}

int pre[MAXN],suf[MAXN];
int dp[MAXN][21],ma[MAXN];
void St(){
    inc(i,2,n)ma[i]=ma[i/2]+1;
    inc(i,1,n)dp[i][0]=suf[i];
    inc(j,1,20){
	for(int i=1;i+(1<<j)<=n+1;i++){
	    dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
	}
    }
}

int Max(int l,int r){
    int k=r-l+1;k=ma[k];
    return max(dp[l][k],dp[r-(1<<k)+1][k]);
}

int main(){
    n=read();
    inc(i,1,n)a[i]=read();
    cnt=0;newnode(rt);insert(0);
    int key=0;
    inc(i,1,n)key^=a[i],pre[i]=query(key),insert(key);
    cnt=0;newnode(rt);insert(0);
    key=0;
    dec(i,n,1)key^=a[i],suf[i]=query(key),insert(key);
    St();
    int ans=0;
    inc(i,1,n-1){
	ans=max(ans,pre[i]+Max(i+1,n));
    }
    printf("%d\n",ans);
    return 0;
}

  

4260: Codechef REBXOR

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 2515  Solved: 1103
[Submit][Status][Discuss]

Description

 

Input

输入数据的第一行包含一个整数N,表示数组中的元素个数。
第二行包含N个整数A1,A2,…,AN。
 
 

 

Output

输出一行包含给定表达式可能的最大值。
 

 

Sample Input

5
1 2 3 1 2

Sample Output

6

 

posted @ 2019-02-03 03:32  wang9897  阅读(228)  评论(0编辑  收藏  举报