➤ Problem Link : 706D. Vasiliy's Multiset
✅ C++ Solution :
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
struct TrieNode{
TrieNode *arr[2];
int cnt;
ll value;
TrieNode(){
arr[0]=NULL;
arr[1]=NULL;
cnt=0;
}
};
void insert(TrieNode *root, ll val)
{
// cout<<val<<" ";
TrieNode *curr=root;
ll a;
for(ll v=31;v>=0;v--)
{
a=((val/(ll)pow(2,v)) % 2);
a=a%2;
// cout<<a;
if(curr->arr[a]==NULL)
curr->arr[a]=new TrieNode;
curr=curr->arr[a];
}
//cout<<endl;
curr->cnt++;
curr->value=val;
}
bool remove(TrieNode *curr, ll val, ll v)
{
if(v==-1)
{
// cout<<"done\n";
curr->cnt--;
if(curr->cnt==0)
return 1;
return 0;
}
ll a=((val/(ll)pow(2,v)) % 2);
a=a%2;
bool b = remove(curr->arr[a],val,v-1);
if(b)
{
delete curr->arr[a];
curr->arr[a]=NULL;
if(curr->arr[a^1]==NULL)
return 1;
}
return 0;
}
ll find(TrieNode * root, ll val)
{
TrieNode * curr = root;
ll a;
// cout<<val<<endl;
for(ll v=31;v>=0;v--)
{
a=((val/(ll)pow(2,v)) % 2);
a^=1;
if(curr->arr[a]!=NULL)
{
// cout<<a;
curr=curr->arr[a];
}
else
{
// cout<<"2";
curr=curr->arr[a^1];
}
}
return curr->value ^ val;
}
int main()
{
TrieNode * root = new TrieNode;
insert(root,0);
char c;
int q;
ll x;
cin>>q;
while(q--)
{
cin>>c>>x;
if(c=='+')
insert(root,x);
else if(c=='-')
remove(root,x,31);
else
cout<<find(root,x)<<"\n";
}
}
Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook.
😇Happy Learning!!
