【BZOJ4260】Codechef REBXOR

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*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);
}

你可能感兴趣的:(可持久化trie)