-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbinary_trie.cpp
132 lines (118 loc) · 2.53 KB
/
binary_trie.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
In the name of ALLAH
Author : Raashid Anwar
*/
#include <bits/stdc++.h>
using namespace std;
#define int int64_t
const int M1 = 998244353;
const int M2 = 1000000007;
mt19937 rng((uint64_t)chrono::steady_clock::now().time_since_epoch().count());
class btrie {
vector <vector<int>> trie;
vector <int> cnt;
int counter;
public :
btrie() {
trie.resize(1000001, vector<int> (2, 0));
cnt.resize(1000001, 0);
counter = 1;
}
void insert(int x) {
int u = 0;
for (int i = 30; ~i; --i) {
int bit = (x >> i) & 1;
if (!trie[u][bit])
trie[u][bit] = counter++;
u = trie[u][bit];
cnt[u]++;
}
}
bool find(int x) {
int u = 0;
for (int i = 30; ~i; --i) {
int bit = (x >> i) & 1;
u = trie[u][bit];
if (!cnt[u])
return false;
}
return true;
}
void remove(int x) {
if (!find(x))
return ;
int u = 0;
for (int i = 30; ~i; --i) {
int bit = (x >> i) & 1;
u = trie[u][bit];
cnt[u]--;
}
}
int get_min(int x) {
int u = 0, ans = 0;
for (int i = 30; ~i; --i) {
int bit = (x >> i) & 1;
if (cnt[trie[u][bit]]) {
u = trie[u][bit];
} else {
ans += (1 << i);
u = trie[u][bit ^ 1];
}
}
return ans;
}
int get_count(int x) {
int u = 0;
for (int i = 30; ~i; --i) {
int bit = (x >> i) & 1;
u = trie[u][bit];
if (!cnt[u])
return 0;
}
return cnt[u];
}
int get_min_count(int x) {
int u = 0;
for (int i = 30; ~i; --i) {
int bit = (x >> i) & 1;
if (cnt[trie[u][bit]]) {
u = trie[u][bit];
} else {
u = trie[u][bit ^ 1];
}
}
return cnt[u];
}
int get_max(int x) {
int u = 0, ans = 0;
for (int i = 30; ~i; --i) {
int bit = (x >> i) & 1;
if (cnt[trie[u][bit ^ 1]]) {
ans += (1 << i);
u = trie[u][bit];
} else {
u = trie[u][bit];
}
}
return ans;
}
int get_max_count(int x) {
int u = 0;
for (int i = 30; ~i; --i) {
int bit = (x >> i) & 1;
if (cnt[trie[u][bit ^ 1]]) {
u = trie[u][bit];
} else {
u = trie[u][bit];
}
}
return cnt[u];
}
};
void solve() {
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
}