Guest User

trie.cpp

a guest
Dec 6th, 2025
99
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.72 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int MAXB = 5e6 + 1;
  5. struct trie{
  6.     int links[2];
  7.     bool finish = false;
  8.     int cnt = 0;
  9. } b[MAXB];
  10.  
  11. int cntV = 0;
  12.  
  13. void add(long long val){
  14.     int v = 0;
  15.     b[v].cnt++;
  16.     for (int i = 40; i >= 0; i--){
  17.         int alpha = (val >> i) & 1;
  18.         if (b[v].links[alpha] != -1){
  19.             v = b[v].links[alpha];
  20.             b[v].cnt++;
  21.         }
  22.         else{
  23.             cntV++;
  24.             b[v].links[alpha] = cntV;
  25.             v = b[v].links[alpha];
  26.             b[v].links[0] = -1;
  27.             b[v].links[1] = -1;
  28.             b[v].cnt = 1;
  29.         }
  30.     }
  31.     b[v].finish = true;
  32. }
  33.  
  34. void del(long long val){
  35.     int v = 0;
  36.     b[v].cnt--;
  37.     for (int i = 40; i >= 0; i--){
  38.         int alpha = (val >> i) & 1;
  39.         if (b[v].links[alpha] != -1){
  40.             v = b[v].links[alpha];
  41.             b[v].cnt--;
  42.         }
  43.     }
  44.     b[v].finish = false;
  45. }
  46.  
  47. int ffind(long long val){
  48.     int v = 0;
  49.     long long ans = 0;
  50.     for (int i = 40; i >= 0; i--){
  51.         int alpha = (val >> i) & 1;
  52.         if (b[v].links[1 - alpha] != -1 && b[b[v].links[1 - alpha]].cnt > 0){
  53.             ans += (1LL << i);
  54.             v = b[v].links[1 - alpha];
  55.         }
  56.         else{
  57.             v = b[v].links[alpha];
  58.         }
  59.     }
  60.     return ans;
  61. }
  62.  
  63. int main()
  64. {
  65.     add(0);
  66.     add(0);
  67.     suf[n + 1] = 0;
  68.     for (int i = n; i >= 1; i--){
  69.         suf[i] = suf[i + 1] ^ a[i];
  70.         add(suf[i]);
  71.     }
  72.     suf[0] = 0;
  73.     pref[0] = 0;
  74.     for (int i = 0; i <= n; i++){
  75.         del(suf[i])
  76.         if (i >= 1){
  77.             pref[i] = pref[i - 1] ^ a[i];
  78.         }
  79.  
  80.         ans = max(ans, ffind(pref[i]));
  81.     }
  82.  
  83.  
  84.     return 0;
  85. }
  86.  
  87.  
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment