4260: Codechef REBXOR
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 2127 Solved: 915
Description
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*10^5,0 ≤ Ai ≤ 10^9。
解析:
令 表示 中的最大
。
令 表示 中的最大
。
则答案为最大的 。
令 表示
那么 。求同理。
至于为什么要插入 ,因为求 是。如果求1~r的抑或和就要用到。
代码:
#include <bits/stdc++.h>
using namespace std;
const int Max=400010;
int n,m,tot,now,ans;
int tree[Max*33][2],num[Max],l[Max],r[Max];
inline int get_int()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') f=-1,c=getchar();
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline void add(int x)
{
int pos=0;
for(int i=31;~i;i--)
{
int k=x>>i&1;
if(!tree[pos][k]) tree[pos][k]=++tot;
pos=tree[pos][k];
}
}
inline int Q(int x)
{
int pos=0,ans=0;
for(int i=31;~i;i--)
{
int k=x>>i&1;
if(tree[pos][k^1]) pos=tree[pos][k^1],ans|=1<<i;
else pos=tree[pos][k];
}
return ans;
}
inline void solve()
{
add(0);
for(int i=1;i<=n;i++)
{
now^=num[i];
if(i!=1) l[i]=max(l[i-1],Q(now));
add(now);
}
now=tot=0,memset(tree,0,sizeof(tree)),add(0);
for(int i=n;i>=1;i--)
{
now^=num[i];
if(i!=n) r[i]=max(r[i+1],Q(now));
add(now);
}
for(int i=1;i<=n-1;i++) ans=max(ans,l[i]+r[i+1]);
}
int main()
{
n=get_int();
for(int i=1;i<=n;i++) num[i]=get_int();
solve();
cout<<ans;
return 0;
}