Description
题解:
知道套路就简单了,直接搞出L[i],R[i]两个分别表示左边右边的最大值的数组就好了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
const int maxn=400010;
int n,a[maxn],root[maxn],s[maxn];
int tot=0,id[maxn*33],son[maxn*33][2];
int L[maxn],R[maxn];
void ins(int last,int p,int x)
{
root[p]=++tot;id[tot]=p;
int now=tot;last=root[last];
for(int i=30;i>=0;i--)
{
int t=((x>>i)&1);
son[now][t^1]=son[last][t^1];
son[now][t]=++tot;id[tot]=p;
now=son[now][t];last=son[last][t];
}
}
int query(int l,int r,int x)
{
int now=root[r],re=0;
for(int i=30;i>=0;i--)
{
if(id[now]<l)break;
int t=((x>>i)&1);
if(id[son[now][t^1]]>=l)re|=(1<<i);
else t^=1;
now=son[now][t^1];
}return re;
}
int main()
{
scanf("%d",&n);s[0]=0;
for(int i=1;i<=n;i++)scanf("%d",&a[i]),s[i]=s[i-1]^a[i];
id[0]=-1;ins(0,0,0);
for(int i=1;i<=n;i++)ins(i-1,i,s[i]);
L[1]=0;
for(int i=2;i<n;i++)L[i]=max(L[i-1],query(1,i,s[i]));
R[n]=0;
for(int i=n-1;i>1;i--)R[i]=max(R[i+1],query(i,n,s[i]));
LL ans=0;
for(int i=1;i<n;i++)ans=max(ans,(LL)(L[i])+(LL)(R[i+1]));
printf("%lld",ans);
}