CF817E Choosing The Commander(Trie)

字典树的裸题,插入删除很简单,对于查询,只要进行分类讨论,先计算合法方案,然后使得相异或的答案永远和l保持一致即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e6+10;
int cnt[N];
struct node{
    node *nxt[2];
    ll cnt;
}*rt;
node pool[N];
ll idx,num;
void insert(ll x,int k){
    int i;
    node *p=rt;
    for(i=30;i>=0;i--){
        int sign=x>>i&1;
        if(p->nxt[sign]==NULL){
            p->nxt[sign]=pool+(++idx);
            p->nxt[sign]->cnt=++num;
        }
        p=p->nxt[sign];
        cnt[p->cnt]+=k;
    }
}
ll query(ll a,ll b){
    node *p=rt;
    ll ans=0;
    int i;
    for(i=30;i>=0;i--){
        int tmp1=(a>>i)&1,tmp2=(b>>i)&1;
        if(tmp2==1){
            if(p->nxt[tmp1])
            ans+=cnt[p->nxt[tmp1]->cnt];
            if(tmp1==1){
                if(p->nxt[tmp1^1])
                p=p->nxt[tmp1^1];
                else
                break;
            }
            else{
                if(p->nxt[tmp1^1])
                p=p->nxt[tmp1^1];
                else
                break;
            }
        }
        else{
            if(p->nxt[tmp1])
            p=p->nxt[tmp1];
            else{
                break;
            }
        }
    }
    return ans;
}
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    rt=pool;
    rt->cnt=0;
    while(t--){
        int opt;
        cin>>opt;
        if(opt==1){
            ll x;
            cin>>x;
            insert(x,1);
        }
        else if(opt==2){
            ll x;
            cin>>x;
            insert(x,-1);
        }
        else{
            ll p,l;
            cin>>p>>l;
            cout<<query(p,l)<<endl;
        }
    }
}
View Code

 

posted @ 2020-08-21 23:16  朝暮不思  阅读(132)  评论(0编辑  收藏  举报