bzoj3261 最大异或和(可持久化Trie)

明天就要正式开始省选之后的康复训练了呢,毕竟距离ctsc就只有那么几天了qaq(感觉自己药丸)
这题还需要前缀和一下…求a[p]^a[p+1]^…^a[n]^x最大,就相当于是求sum[p-1]^sum[n]^x最大。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 600010
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,m,rt[N],sum,bin[30],owo=0;
char op[5];
struct node{
    int son[2],sz;
}tr[N*30];
inline void ins(int &root,int val){
    tr[++owo]=tr[root];root=owo;int p=owo;tr[p].sz++;
    for(int i=23;i>=0;--i){
        bool op=val&bin[i];
        tr[++owo]=tr[tr[p].son[op]];tr[p].son[op]=owo;p=owo;tr[p].sz++;
    }
}
inline int ask(int p1,int p2,int val){
    int res=0;
    for(int i=23;i>=0;--i){
        bool op=val&bin[i];op^=1;
        int sz=tr[tr[p2].son[op]].sz-tr[tr[p1].son[op]].sz;
        if(sz>=1) res|=bin[i],p1=tr[p1].son[op],p2=tr[p2].son[op];
        else p1=tr[p1].son[op^1],p2=tr[p2].son[op^1];
    }return res;
}
int main(){
//  freopen("a.in","r",stdin);
    n=read();m=read();bin[0]=1;
    for(int i=1;i<=23;++i) bin[i]=bin[i-1]<<1;
    ins(rt[0],0);
    for(int i=1;i<=n;++i){
        sum^=read();rt[i]=rt[i-1];ins(rt[i],sum);
    }while(m--){
        scanf("%s",op+1);
        if(op[1]=='A'){
            sum^=read();++n;rt[n]=rt[n-1];ins(rt[n],sum);
        }else{
            int l=read()-1,r=read()-1,x=read()^sum;
            printf("%d\n",ask(l?rt[l-1]:0,rt[r],x));
        }
    }return 0;
}

猜你喜欢

转载自blog.csdn.net/icefox_zhx/article/details/80160165