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 01Trie 板题。

// 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

Codeforces 706D Vasiliy's Multiset(可持久化字典树)

D. Multiset(带排名的数组数组)