【BZOJ4260】Codechef REBXOR
阿新 • • 發佈:2018-12-13
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。
解析: 令 表示 的最大 , 表示 的最大 ,則答案為最大的 。
令 表示,那麼 。求同理。
程式碼:
#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; }