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

Posted birchtree

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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');
    

以上是关于[51nod 1295]Xor key(可持久化trie)的主要内容,如果未能解决你的问题,请参考以下文章

51Nod - 1295:XOR key (可持久化Trie求区间最大异或)

51nod 3047位运算(and 和 xor)位移运算

位运算 异或51nod区间xor

51nod 2653位运算(异或)区间xor

51nod 2653位运算(异或)区间xor

51nod 1310:Chandrima and XOR