Input
输入数据的第一行包含一个整数N,表示数组中的元素个数。
第二行包含N个整数A1,A2,…,AN。
Output
输出一行包含给定表达式可能的最大值。
Sample Input
5
1 2 3 1 2
Sample Output
6
HINT
满足条件的(l1,r1,l2,r2)有:(1,2,3,3),(1,2,4,5),(3,3,4,5)。
对于100%的数据,2 ≤ N ≤ 4*105,0 ≤ Ai ≤ 109。
Source
By yts1999
人家都是一个trie然后扫一扫..
我写个可持久化trie暴力草..
然后就倒数第一了..
今天诸事不顺..
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 400010
#define SIZE 12800005
#define GET (ch>='0'&&ch<='9')
using namespace std;
void in(int &x)
{
char ch=getchar();x=0;
while (!GET) ch=getchar();
while (GET) x=x*10+ch-'0',ch=getchar();
}
int n,cnt,maxn;
int a[MAXN],f[MAXN][2];
int root[MAXN],ls[SIZE],rs[SIZE],sz[SIZE];
void ins(int x,int &y,int val,int dep)
{
sz[y=++cnt]=sz[x]+1;
if (dep<0) return;
ls[y]=ls[x];rs[y]=rs[x];
if (val&(1<<dep)) ins(rs[x],rs[y],val,dep-1);
else ins(ls[x],ls[y],val,dep-1);
}
inline int query(int x,int y,int val)
{
int ret=0;
for (int i=30;i>=0;i--)
{
int tmp=val&(1<<i);
if (!tmp)
{
if (sz[rs[y]]-sz[rs[x]]) ret|=(1<<i),x=rs[x],y=rs[y];
else x=ls[x],y=ls[y];
}
else
{
if (sz[ls[y]]-sz[ls[x]]) ret|=(1<<i),x=ls[x],y=ls[y];
else x=rs[x],y=rs[y];
}
}
return ret;
}
int main()
{
in(n);int maxn=0,ans=0;
for (int i=1;i<=n;i++) in(a[i]),a[i]^=a[i-1];
for (int i=1;i<=n;i++) ins(root[i-1],root[i],a[i],30);
for (int i=n-1;i;i--)
maxn=max(maxn,query(root[i],root[n],a[i])),
ans=max(ans,maxn+query(root[1],root[i],a[i]));
printf("%d\n",ans);
}