Educational Codeforces Round 23 E. Choosing The Commander Trie

链接:

http://codeforces.com/contest/817/problem/E

题意:

3种操作:

1 插入一个数

2 删除一个数

3 给出一个数pi和l,询问有多少个数pj满足pi^pj<l

题解:

把每个数用bitset变成字符串,然后建字典树,询问的时候当碰到 l 的某一位为1的某一位为1的时候,就更新结果,然后继续搜索

代码:

31 int Trie[MAXN][2], val[MAXN];
32 int sz = 1;
33 
34 void insert(string s, int value) {
35     int now = 1;
36     rep(i, 0, s.length()) {
37         int x = s[i] - '0';
38         if (!Trie[now][x]) Trie[now][x] = ++sz;
39         now = Trie[now][x];
40         val[now] += value;
41     }
42 }
43 
44 int query(string s, string t) {
45     int now = 1, ret = 0;
46     rep(i, 0, s.length()) {
47         int a = s[i] - '0';
48         int b = t[i] - '0';
49         if (b) ret += val[Trie[now][a]];
50         now = Trie[now][a^b];
51     }
52     return ret;
53 }
54 
55 int main() {
56     ios::sync_with_stdio(false), cin.tie(0);
57     int q;
58     cin >> q;
59     while(q--) {
60         int k, p, l;
61         cin >> k >> p;
62         if (k == 1) {
63             string s = bitset<30>(p).to_string();
64             insert(s, 1);
65         }
66         else if (k == 2) {
67             string s = bitset<30>(p).to_string();
68             insert(s, -1);
69         }
70         else {
71             cin >> l;
72             string s = bitset<30>(p).to_string();
73             string t = bitset<30>(l).to_string();
74             cout << query(s, t) << endl;
75         }
76     }
77     return 0;
78 }

 

posted @ 2017-08-15 18:25  Flowersea  阅读(151)  评论(0编辑  收藏  举报