Guest User

E.cpp

a guest
Dec 10th, 2025
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int MAXN = 1e6 + 2;
  5. struct trie{
  6.     int cnt = 0;
  7.     int links[2];
  8. } b[30 * MAXN];
  9. int pr[MAXN];
  10.  
  11. //vector <trie> b;
  12.  
  13. int cntV = 0;
  14.  
  15. void add(int x){
  16.     int v = 0;
  17.     b[v].cnt++;
  18.     int bit;
  19.     for (int i = 29; i >= 0; i--){
  20.         bit = (x >> i) & 1;
  21.         if (b[v].links[bit] != -1){
  22.             v = b[v].links[bit];
  23.             b[v].cnt++;
  24.         }
  25.         else{
  26.             cntV++;
  27.             b[v].links[bit] = cntV;
  28.             v = cntV;
  29.             b[v].cnt++;
  30.             b[v].links[0] = -1;
  31.             b[v].links[1] = -1;
  32.         }
  33.     }
  34. }
  35.  
  36. int get_cnt(int x, int k){
  37.     int ans = 0;
  38.     int v = 0;
  39.     int bitX, bitK;
  40.     for (int i = 29; i >= 0; i--){
  41.         bitX = (x >> i) & 1;
  42.         bitK = (k >> i) & 1;
  43.  
  44.         if (bitK == 0 && bitX == 0){
  45.             if (b[v].links[1] != -1){
  46.                 ans += b[b[v].links[1]].cnt;
  47.             }
  48.             if (b[v].links[0] != -1){
  49.                 v = b[v].links[0];
  50.             }
  51.             else{
  52.                 return ans;
  53.             }
  54.         }
  55.  
  56.         if (bitK == 0 && bitX == 1){
  57.             if (b[v].links[0] != -1){
  58.                 ans += b[b[v].links[0]].cnt;
  59.             }
  60.             if (b[v].links[1] != -1){
  61.                 v = b[v].links[1];
  62.             }
  63.             else{
  64.                 return ans;
  65.             }
  66.         }
  67.  
  68.         if (bitK == 1){
  69.             if (b[v].links[1 ^ bitX] != -1){
  70.                 v = b[v].links[1 ^ bitX];
  71.             }
  72.             else{
  73.                 return ans;
  74.             }
  75.         }
  76.  
  77.     }
  78.     ans += b[v].cnt;
  79.     return ans;
  80. }
  81.  
  82. int main() {
  83.     ios::sync_with_stdio(false);
  84.     cin.tie(0);
  85.     cout.tie(0);
  86.  
  87.     b[0].links[0] = -1;
  88.     b[0].links[1] = -1;
  89.  
  90.     int n, k;
  91.     cin >> n >> k;
  92.     int a[n + 1];
  93.  
  94.     for (int i = 1; i <= n; i++){
  95.         cin >> a[i];
  96.     }
  97.     add(0);
  98.     long long answer = 0;
  99.     for (int i = 1; i <= n; i++){
  100.         pr[i] = pr[i - 1] ^ a[i];
  101.         answer += get_cnt(pr[i], k);
  102.         add(pr[i]);
  103.     }
  104.     cout << answer;
  105.  
  106.     return 0;
  107. }
  108.  
Advertisement
Add Comment
Please, Sign In to add comment