Guest User

Subsets

a guest
Aug 2nd, 2015
521
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. #include <algorithm>
  2. #include <string>
  3. #include <vector>
  4. #include <queue>
  5. #include <iostream>
  6. #include <cmath>
  7. #include <sstream>
  8. #include <map>
  9. #include <set>
  10. #include <numeric>
  11. #include <memory.h>
  12. #include <cstdio>
  13. #include <assert.h>
  14.  
  15. using namespace std;
  16.  
  17. #define pb push_back
  18. #define INF 1011111111
  19. #define FOR(i, a, b) for (int _n(b), i(a); i < _n; i++)
  20. #define rep(i, n) FOR(i, 0, n)
  21. #define CL(a, v) memset((a), (v), sizeof(a))
  22. #define mp make_pair
  23. #define X first
  24. #define Y second
  25. #define all(c) (c).begin(), (c).end()
  26. #define SORT(c) sort(all(c))
  27.  
  28. typedef long long ll;
  29. typedef vector<int> VI;
  30. typedef pair<int, int> pii;
  31.  
  32. /*** TEMPLATE CODE ENDS HERE */
  33.  
  34. const int maxn = (1 << 17) + 10;
  35. int trie[maxn][2];
  36. int sum[maxn];
  37. int tail[16];
  38.  
  39. int trie2[maxn][2];
  40. int sum2[maxn];
  41.  
  42. void increment(int x, int by, int tr[maxn][2], int sm[maxn], int &size) {
  43.   int at = 0;
  44.   for (int i = 15; i >= 0; --i) {
  45.     int bt = (x >> i) & 1;
  46.     if (tr[at][bt] == -1) {
  47.       tr[at][bt] = size++;
  48.     }
  49.     at = tr[at][bt];
  50.     sm[at] += by;
  51.   }
  52. }
  53.  
  54. int dfs(int at, int x, int pos, int tr[maxn][2], int sm[maxn]) {
  55.   if (at == -1) {
  56.     return 0;
  57.   }
  58.   if (pos == -1) {
  59.     return sm[at];
  60.   }
  61.   if (at && (x & tail[pos]) == tail[pos]) {
  62.     return sm[at];
  63.   }
  64.   int bt = (x >> pos) & 1;
  65.   int s = 0;
  66.   rep(i, 2) {
  67.     if ((i & bt) == i) {
  68.       s += dfs(tr[at][i], x, pos - 1, tr, sm);
  69.     }
  70.   }
  71.   return s;
  72. }
  73.  
  74. int reverse(int x) {
  75.   int y = 0;
  76.   for (int i = 0; i <= 15; ++i) {
  77.     y |= ((x >> i) & 1) << (15 - i);
  78.   }
  79.   return y;
  80. }
  81.  
  82. int main() {
  83. #ifdef LOCAL_HOST
  84.   freopen("input.txt", "r", stdin);
  85. // freopen("output.txt","w",stdout);
  86. #endif
  87.  
  88.   CL(trie, -1);
  89.   rep(i, 17) if (i) tail[i - 1] = (1 << i) - 1;
  90.   CL(trie2, -1);
  91.  
  92.   int Q;
  93.   scanf("%d", &Q);
  94.  
  95.   char s[16];
  96.   int x;
  97.   int size = 1;
  98.   int size2 = 1;
  99.  
  100.   while (Q--) {
  101.     scanf("%s %d", s, &x);
  102.     if (s[0] == 'a') {
  103.       increment(x, 1, trie, sum, size);
  104.       x = reverse(x);
  105.       increment(x, 1, trie2, sum2, size2);
  106.     } else if (s[0] == 'd') {
  107.       increment(x, -1, trie, sum, size);
  108.       x = reverse(x);
  109.       increment(x, -1, trie2, sum2, size2);
  110.     } else {
  111.       int y = reverse(x);
  112.       int cx = 0, cy = 0;
  113.       rep(i, 15) {
  114.         if ((x & tail[i]) == tail[i]) {
  115.           cx = i;
  116.         }
  117.         if ((y & tail[i]) == tail[i]) {
  118.           cy = i;
  119.         }
  120.       }
  121.       if (cx >= cy) {
  122.         int s = dfs(0, x, 15, trie, sum);
  123.         printf("%d\n", s);
  124.       } else {
  125.         int s = dfs(0, y, 15, trie2, sum2);
  126.         printf("%d\n", s);
  127.       }
  128.     }
  129.   }
  130.  
  131. #ifdef LOCAL_HOST
  132.   printf("TIME: %.3lf\n", double(clock()) / CLOCKS_PER_SEC);
  133. #endif
  134.  
  135.   return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment