[BZOJ]4260: Codechef REBXOR
题解:把前缀和丢进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