XOR key

来源:互联网 发布:无线通信优化工程师 编辑:程序博客网 时间:2024/04/30 00:45

51nod 1295
可持久化trie,其实和可持久化线段树差不多
之前写过一次,现在加深了一点点对于可持久化的理解

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define FOR(i,a,b) for(int i=a;i<=b;i++)#define ROF(i,a,b) for(int i=a;i>=b;i--)#define mem(i,a) memset(i,a,sizeof(i))#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define ll long long#define LL long longusing namespace std;const int maxn = 5e4+7;int tr[maxn*40][2],sum[maxn*40],root[maxn];int n,m,cnt=0,x;void update(int len,int x,int &u,int v) {    u = ++cnt;    for(int i = 0;i<2;i++) tr[u][i] = tr[v][i];    sum[u] = sum[v]+1;    if(len==0) return;    update(len-1,x,tr[u][(x>>len-1)&1],tr[v][(x>>len-1)&1]);}int query(int len,int u,int v) {    int now = 1-((x>>(len-1))&1);    if(len==0) return 0;    if(sum[tr[u][now]] > sum[tr[v][now]])         return query(len-1,tr[u][now],tr[v][now])+(1<<(len-1));    return  query(len-1,tr[u][1-now],tr[v][1-now]);}int main() {    scanf("%d%d",&n,&m);    for(int i = 1;i<=n;i++) {        scanf("%d",&x);        update(30,x,root[i],root[i-1]);    }    int l,r;    for(int i = 1;i<=m;i++) {        scanf("%d%d%d",&x,&l,&r);        printf("%d\n",query(30,root[r+1],root[l]));    }    return 0;}
原创粉丝点击