[51nod 1295]Xor key(可持久化trie)

[51nod 1295]Xor key(可持久化trie)

题面

给出一个长度为n的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R)。求A[L] 至 A[R] 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值是多少?

分析

可持久化trie裸题

代码

#include<iostream>
#include<cstdio>
#define maxb 31
#define maxn 200000
#define maxs 6400000
using namespace std;
inline void qread(int &x){
    x=0;
    int sign=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') sign=-1;
        c=getchar();
    } 
    while(c>='0'&&c<='9'){
        x=x*10+c-'0';
        c=getchar();
    }
    x=x*sign; 
}
inline void qprint(int x){
    if(x<0){
        putchar('-');
        qprint(-x);
    }else if(x==0){
        putchar('0');
        return;
    }else{
        if(x>=10) qprint(x/10);
        putchar('0'+x%10);
    } 
}

int n,q;
int a[maxn+5];

struct persist_trie{
    int sz[maxs+5];
    int root[maxn+5];
    int son[maxs+5][2];
    int ptr=0;
    void insert(int pos,int val){
        int now=root[pos]=++ptr;
        int last=root[pos-1];
        for(int i=maxb;i>=0;i--){
            sz[now]=sz[last]+1;
            int k=(val>>i)&1;
            son[now][k]=++ptr;
            son[now][k^1]=son[last][k^1];
            now=son[now][k];
            last=son[last][k];
        } 
        sz[now]=sz[last]+1;
    } 
    int query(int l,int r,int val){
        int now=root[r];
        int last=root[l-1];
        int ans=0;
        for(int i=maxb;i>=0;i--){
            int k=(val>>i)&1;
            int lsz=sz[son[now][k^1]]-sz[son[last][k^1]];
            if(lsz){
                now=son[now][k^1];
                last=son[last][k^1];
                ans=ans*2+1;
            }else{
                now=son[now][k];
                last=son[last][k];
                ans=ans*2;
            }
        }
        return ans;
    }
}T;

int main(){
//  freopen("1.in","r",stdin);
//  freopen("1.ans","w",stdout);
    int l,r,x;
    qread(n);
    qread(q);
    for(int i=1;i<=n;i++){
        qread(a[i]);
        T.insert(i,a[i]);
    }
    for(int i=1;i<=q;i++){
        qread(x);
        qread(l);
        qread(r);
        l++;
        r++;
        qprint(T.query(l,r,x));
        putchar('\n');
    }
}

猜你喜欢

转载自www.cnblogs.com/birchtree/p/11624657.html
今日推荐