题解:把前缀和丢进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 MBSubmit: 2515 Solved: 1103
[Submit][Status][Discuss]
Description
Input
输入数据的第一行包含一个整数N,表示数组中的元素个数。
第二行包含N个整数A1,A2,…,AN。
Output
输出一行包含给定表达式可能的最大值。
Sample Input
5
1 2 3 1 2
1 2 3 1 2
Sample Output
6