Advertisement
tiom4eg

minimalistic trie using 2 std::array

Aug 23rd, 2022
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. const int LG = 24, MAX = 1000000; // макс. количество битов в представлении, макс. количество нод в боре
  2. int go[MAX][2]; // аналог std::array
  3. memset(go, -1, sizeof go); // заполним дефолтными значениями
  4. int nidx = 1; // первый неиспользованный индекс
  5. function <void(int)> add = [&](int x) {
  6.     int cur = 0;
  7.     for (int i = LG - 1; i >= 0; --i) {
  8.         int bit = (x >> i) & 1;
  9.         if (go[cur][bit] == -1) go[cur][bit] = nidx++;
  10.         cur = go[cur][bit];
  11.     }
  12.     // здесь можно добавить сохранение какой-то информации, но это не влезет в 2 std::array
  13. };
  14. function <int(void)> get_max = [&]() { // необходимо, чтобы в боре было хотя бы одно число
  15.     int res = 0, cur = 0;
  16.     for (int i = LG - 1; i >= 0; --i) {
  17.         if (go[cur][1] == -1) cur = go[cur][0]; // придётся идти в нулевой разряд...
  18.         else {
  19.             res |= (1 << i);
  20.             cur = go[cur][1];
  21.         }
  22.     }
  23.     return res;
  24. };
  25. function <int(void)> get_min = [&]() { // необходимо, чтобы в боре было хотя бы одно число
  26.     int res = 0, cur = 0;
  27.     for (int i = LG - 1; i >= 0; --i) {
  28.         if (go[cur][0] == -1) { // придётся идти в единичный разряд...
  29.             res |= (1 << i);
  30.             cur = go[cur][1];
  31.         }
  32.         else cur = go[cur][0];
  33.     }
  34.     return res;
  35. };
  36. // затестим
  37. add(2);
  38. add(5);
  39. assert(get_min() == 2 && get_max() == 5);
  40. add(1 << 23);
  41. add(0);
  42. add(7);
  43. add(2);
  44. assert(get_min() == 0 && get_max() == 8388608);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement