D. Vasiliy‘s Multiset(01Trie)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Vasiliy‘s Multiset(01Trie)相关的知识,希望对你有一定的参考价值。
D. Vasiliy’s Multiset(01Trie)
支持插入,删除,异或最值。
01
−
T
r
i
e
01-Trie
01−Trie 板题。
// Problem: D. Vasiliy's Multiset
// Contest: Codeforces - Codeforces Round #367 (Div. 2)
// URL: https://codeforces.ml/problemset/problem/706/D
// Memory Limit: 256 MB
// Time Limit: 4000 ms
// Date: 2021-08-03 16:15:46
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
}
#define il inline
struct Trie{
int son[N*30][2],sz[N*30],cnt;
il void ins(int x){
int p=0;
for(int i=30;~i;i--){
int &s=son[p][x>>i&1];
if(!s) s=++cnt;
p=s;
sz[p]++;
}
}
il void del(int x){
int p=0;
for(int i=30;~i;i--){
int &s=son[p][x>>i&1];
p=s;
if(!--sz[p]) s=0;
}
}
il int que(int x){
int p=0,ans=0;
for(int i=30;~i;i--){
int s=x>>i&1;
if(son[p][!s]) ans+=1<<i,p=son[p][!s];
else p=son[p][s];
}
return ans;
}
}T;
int main(){
int n;
scanf("%d",&n);
T.ins(0); //pay attention
while(n--){
char op;int x;scanf("\\n%c %d\\n",&op,&x);
if(op=='+') T.ins(x);
else if(op=='-') T.del(x);
else printf("%d\\n",T.que(x));
}
return 0;
}
以上是关于D. Vasiliy‘s Multiset(01Trie)的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 706D Vasiliy's Multiset
(字典树)codeforces - 706D Vasiliy's Multiset
Vasiliy's Multiset CodeForces -706D || 01字典树模板
trie树 Codeforces Round #367 D Vasiliy's Multiset