【Codeforces Round 367 (Div 2) D】【字典树典型题】Vasiliy's Multiset
2016-08-12 10:23
453 查看
D. Vasiliy's Multiset
time limit per test
4 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Author has gone out of the stories about Vasiliy, so here is just a formal task description.
You are given q queries
and a multiset A, initially containing only integer 0.
There are three types of queries:
"+ x" — add integer x to
multiset A.
"- x" — erase one occurrence of integer x from
multiset A. It's guaranteed that at least one x is
present in the multiset A before this query.
"? x" — you are given integer x and
need to compute the value
![](http://codeforces.com/predownloaded/af/1b/af1b4d5401ef843e35de22bbd1367fa78816de31.png)
,
i.e. the maximum value of bitwise exclusive OR (also know as XOR) of integer x and
some integer y from the multiset A.
Multiset is a set, where equal elements are allowed.
Input
The first line of the input contains a single integer q (1 ≤ q ≤ 200 000) —
the number of queries Vasiliy has to perform.
Each of the following q lines
of the input contains one of three characters '+', '-'
or '?' and an integer xi (1 ≤ xi ≤ 109).
It's guaranteed that there is at least one query of the third type.
Note, that the integer 0 will always
be present in the set A.
Output
For each query of the type '?' print one integer — the maximum value of bitwise
exclusive OR (XOR) of integer xi and
some integer from the multiset A.
Example
input
output
Note
After first five operations multiset A contains
integers 0, 8, 9, 11, 6 and 1.
The answer for the sixth query is integer
![](http://codeforces.com/predownloaded/f1/be/f1be3f0eb002b70f2885010a36a4ee3437035f76.png)
—
maximum among integers
![](http://codeforces.com/predownloaded/37/b9/37b978f8f58974079cd14c236f215799c4498de1.png)
,
![](http://codeforces.com/predownloaded/5d/c1/5dc10ff70d05fbc23f9ca460fcdaabd323da2000.png)
,
![](http://codeforces.com/predownloaded/25/ea/25eadc76e65c2dcc9e605d7cbcb8b85c432154b6.png)
,
![](http://codeforces.com/predownloaded/4e/9f/4e9f7b2b7c9c3c4a682f5417c5422483016ee463.png)
and
![](http://codeforces.com/predownloaded/6f/0d/6f0d4181cb4df733db930b2d79c66c1f83fafd42.png)
.
time limit per test
4 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Author has gone out of the stories about Vasiliy, so here is just a formal task description.
You are given q queries
and a multiset A, initially containing only integer 0.
There are three types of queries:
"+ x" — add integer x to
multiset A.
"- x" — erase one occurrence of integer x from
multiset A. It's guaranteed that at least one x is
present in the multiset A before this query.
"? x" — you are given integer x and
need to compute the value
![](http://codeforces.com/predownloaded/af/1b/af1b4d5401ef843e35de22bbd1367fa78816de31.png)
,
i.e. the maximum value of bitwise exclusive OR (also know as XOR) of integer x and
some integer y from the multiset A.
Multiset is a set, where equal elements are allowed.
Input
The first line of the input contains a single integer q (1 ≤ q ≤ 200 000) —
the number of queries Vasiliy has to perform.
Each of the following q lines
of the input contains one of three characters '+', '-'
or '?' and an integer xi (1 ≤ xi ≤ 109).
It's guaranteed that there is at least one query of the third type.
Note, that the integer 0 will always
be present in the set A.
Output
For each query of the type '?' print one integer — the maximum value of bitwise
exclusive OR (XOR) of integer xi and
some integer from the multiset A.
Example
input
10 + 8 + 9 + 11 + 6 + 1 ? 3 - 8 ? 3 ? 8 ? 11
output
11 10 14 13
Note
After first five operations multiset A contains
integers 0, 8, 9, 11, 6 and 1.
The answer for the sixth query is integer
![](http://codeforces.com/predownloaded/f1/be/f1be3f0eb002b70f2885010a36a4ee3437035f76.png)
—
maximum among integers
![](http://codeforces.com/predownloaded/37/b9/37b978f8f58974079cd14c236f215799c4498de1.png)
,
![](http://codeforces.com/predownloaded/5d/c1/5dc10ff70d05fbc23f9ca460fcdaabd323da2000.png)
,
![](http://codeforces.com/predownloaded/25/ea/25eadc76e65c2dcc9e605d7cbcb8b85c432154b6.png)
,
![](http://codeforces.com/predownloaded/4e/9f/4e9f7b2b7c9c3c4a682f5417c5422483016ee463.png)
and
![](http://codeforces.com/predownloaded/6f/0d/6f0d4181cb4df733db930b2d79c66c1f83fafd42.png)
.
#include<stdio.h> #include<iostream> #include<string.h> #include<string> #include<ctype.h> #include<math.h> #include<set> #include<map> #include<vector> #include<queue> #include<bitset> #include<algorithm> #include<time.h> using namespace std; void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); } #define MS(x,y) memset(x,y,sizeof(x)) #define MC(x,y) memcpy(x,y,sizeof(x)) #define MP(x,y) make_pair(x,y) #define ls o<<1 #define rs o<<1|1 typedef long long LL; typedef unsigned long long UL; typedef unsigned int UI; template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; } template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; } const int N = 1e7 + 10, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f; int nxt [2], id; int num ; void ins(int x, int val) { int k = 0; for (int i = 29; ~i; --i) { int y = x >> i & 1; if (nxt[k][y] == 0)nxt[k][y] = ++id; k = nxt[k][y]; num[k] += val; } } int check(int x) { int ret = 0; int k = 0; for (int i = 29; ~i; --i) { int y = x >> i & 1; if (nxt[k][y] == 0 || num[nxt[k][y]] == 0)y ^= 1; else ret |= 1 << i; k = nxt[k][y]; } return ret; } int main() { int n; while (~scanf("%d", &n)) { MS(nxt, 0); id = 0; MS(num, 0); ins(0, 1); while (n--) { char ch; int x; scanf(" %c%d", &ch, &x); if (ch == '+')ins(x, 1); else if (ch == '-')ins(x, -1); else printf("%d\n", check(~x)); } } return 0; }
相关文章推荐
- Codeforces Round #367 (Div. 2) [D] Vasiliy's Multiset(01字典树模板)
- Codeforces Round #367 (Div. 2)-Vasiliy's Multiset-最大异或和-trie
- Codeforces Round #367 (Div. 2) D Vasiliy's Multiset(01Trie)
- Codeforces Round #367 (Div. 2) 字典树-xor
- 【Codeforces Round 367 (Div 2) B】【二分查找】Interesting drink
- Codeforces Round #367 (Div. 2) E. Working routine (十字链表)
- 【Codeforces Round 367 (Div 2) C】【简单DP】Hard problem
- Codeforces Round #430 (Div. 2) D.Vitya and Strange Lesson 异或 01字典树补集最小
- 【Codeforces Round #430 (Div. 2) D】 D. Vitya and Strange Lesson ("带lazy" 的字典树)
- Codeforces Round #367 (Div. 2) B. Interesting drink(二分)
- Codeforces Round #430 (Div. 2) - D. Vitya and Strange Lesson (01字典树)
- Codeforces Round #430 (Div. 2) D.Vitya and Strange Lesson 异或 01字典树补集最小
- Codeforces Round #291 (Div. 2)C.Watto and Mechanism——字典树+dfs
- Codeforces Round #367 (Div. 2) E 十字链表
- Codeforces Round #430 (Div. 2) D.Vitya and Strange Lesson 异或 01字典树补集最小
- Codeforces Round #367 (Div. 2)-C - Hard problem-DP
- 【Codeforces Round 367 (Div 2) E】【十字链表 边框维护】Working routine nm矩形交换q次子矩形的最终矩形
- Codeforces Round #430 (Div. 2) D.Vitya and Strange Lesson 异或 01字典树补集最小
- Codeforces Round #430 (Div. 2) D.Vitya and Strange Lesson 异或 01字典树补集最小
- Codeforces Round #430 (Div. 2) D.Vitya and Strange Lesson 异或 01字典树补集最小