首页 > 代码库 > 【bzoj3261】最大异或和

【bzoj3261】最大异或和

就是一个可持久化Trie.......

#include<bits/stdc++.h>
#define N 600005
using namespace std;
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch==-)f=-1;}while(ch<0||ch>9);
    do{x=x*10+ch-0;ch=getchar();}while(ch>=0&&ch<=9);
    return f*x;
}
int bin[30],n,m,a[N],b[N],rt[N];
struct Trie{
    int cnt,c[N*24][2],sum[N*24];
    int ins(int x,int val){
        int tmp,y;tmp=y=++cnt;
        for(int i=23;i>=0;i--){
            c[y][0]=c[x][0];c[y][1]=c[x][1];
            sum[y]=sum[x]+1;
            int t=val&bin[i];t>>=i;
            x=c[x][t];c[y][t]=++cnt;y=c[y][t];
        }
        sum[y]=sum[x]+1;
        return tmp;
    }
    int query(int l,int r,int val){
        int tmp=0;
        for(int i=23;i>=0;i--){
            int t=val&bin[i];t>>=i;
            if(sum[c[r][t^1]]-sum[c[l][t^1]])
            tmp+=bin[i],r=c[r][t^1],l=c[l][t^1];
            else r=c[r][t],l=c[l][t];
        }
        return tmp;
    }
}T;
int main(){
    bin[0]=1;for(int i=1;i<=30;i++)bin[i]=bin[i-1]<<1;
    n=read();m=read();n++;
    for(int i=2;i<=n;i++)a[i]=read();
    for(int i=1;i<=n;i++)b[i]=b[i-1]^a[i];
    for(int i=1;i<=n;i++)rt[i]=T.ins(rt[i-1],b[i]);
    char s[10];int l,r,x;
    while(m--){
        scanf("%s",s);
        if(s[0]==A){
            n++;a[n]=read();b[n]=b[n-1]^a[n];
            rt[n]=T.ins(rt[n-1],b[n]);
        }
        else{
            l=read();r=read();x=read();
            printf("%d\n",T.query(rt[l-1],rt[r],b[n]^x));
        }
    }
}

 

【bzoj3261】最大异或和