Untitled
unknown
plain_text
2 years ago
1.9 kB
2
Indexable
#include <iostream> #include <vector> #include <cmath> using namespace std; struct Node{ int cnt; int go[2]; Node(){ cnt=0; for (int i = 0; i < 2; i++){ go[i] = -1; } } }; vector<Node> trie; void addNumber(long long int x){ int v = 0; for (int i = 3; i>-1; i--){ int cur = ((x >> i) & 1); if (trie[v].go[cur] == -1){ trie.push_back(Node()); trie[v].go[cur] = trie.size()-1; } v = trie[v].go[cur]; } trie[v].cnt++; } void del(long long int x){ int v=0; for (int i = 3; i>-1; i--){ int cur = ((x >> i) & 1); v = trie[v].go[cur]; } trie[v].cnt--; } long long int max_xor(long long int x){ vector<int> binary; int v = 0; for (int i = 3; i > -1; i--){ int cur = ((x >> i) & 1); if (cur){ if (trie[v].go[0]!=-1){ v = trie[v].go[0]; binary.push_back(1); } else { v = trie[v].go[1]; binary.push_back(0); } } else { int p = trie[v].go[0]; int pp = trie[v].go[1]; if (trie[v].go[1]!=-1){ v = trie[v].go[1]; binary.push_back(1); } else { v = trie[v].go[0]; binary.push_back(0); } } } long long int res=0; for (int i=0;i<binary.size();i++){ if (binary[i]) res+=pow(2,binary.size()-1-i); } return res; } int main() { trie.push_back(Node()); long long int q,x,res; string s; cin>>q; for (int i=0;i<q;i++){ cin>>s>>x; if (s == "+"){ addNumber(x); } else if (s == "-"){ del(x); } else { res = max_xor(x); cout<<res<<endl; } } return 0; }
Editor is loading...