字典树的裸题,插入删除很简单,对于查询,只要进行分类讨论,先计算合法方案,然后使得相异或的答案永远和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; } } }