【BZOJ4260】Codechef REBXOR

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38083668/article/details/82928555

                              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。

解析:
       令 l[ i ] 表示 1<=l<=r<=i 中的最大

      A[l]xorA[l+1]xor.......xorA[r]

       令 r[i] 表示 i<=l<=r<=N中的最大

       A[l]xorA[l+1]xor.......xorA[r]

       则答案为最大的 l[i]+r[i+1]

       令sum[i] 表示A[o]xorA[1]xor.......A[i](A[0]=0)

       那么 l[i]=max(sum[i]xorsum[j])(0<=j<i)。求r[i]同理。

       至于为什么要插入 A[0]=0 ,因为求 xorsum[l,r]sum[l-1]xorsum[r]。如果求1~r的抑或和就要用到sum[0]

代码:

#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;
}

猜你喜欢

转载自blog.csdn.net/m0_38083668/article/details/82928555