显示原始代码
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
#define LETTER 2
struct Trie {
int num;
int next[LETTER];
} trie[500001];
int cnt;
int biase = 0;
void init() {
cnt = 0;
memset(trie, 0, sizeof(Trie));
}
void insert(queue<int> s) {
int cur = 0;
while (!s.empty()) {
int &pos = trie[cur].next[(s.front() + biase) % 2];
s.pop();
if (!pos) {
pos = ++cnt;
memset(trie + cnt, 0, sizeof(Trie));
}
cur = pos;
}
trie[cur].num++;
}
int add(int num1 = 0) {
int &cur = trie[num1].next[0], &cur1 = trie[num1].next[1];
int result = 0;
if (cur1 && cur) {
result = (trie[cur].num % 2 + trie[cur1].num % 2) % 2;
result += (add(cur) % 2 + add(cur1) % 2) % 2 * 2;
result += (add(cur) / 2) * 2;
result += (add(cur1) / 2) * 2;
return result;
} else if (cur1 && !cur) {
result += trie[cur1].num % 2;
result += add(cur1) * 2;
return result;
} else if (cur && !cur1) {
result += trie[cur].num % 2;
result += add(cur) * 2;
return result;
}
return 0;
}
void change_end(int num1 = 0) {
int &cur = trie[num1].next[(biase) % 2], &cur1 = trie[num1].next[(1 + biase) % 2];
int &tmp_cur = trie[cur].next[biase % 2], &tmp_cur1 = trie[num1].next[(1 + biase) % 2];
if (!tmp_cur && !tmp_cur1) {
tmp_cur1 = cnt++;
memset(trie + cnt, 0, sizeof(Trie));
}
if (cur)
change_end(cur);
if (cur1)
change_end(cur1);
}
void plus_one(int num1 = 0) {
biase++;
change_end();
}
void bfs(int num1 = 0) {
int &cur = trie[num1].next[biase % 2];
int &cur1 = trie[num1].next[(1 + biase) % 2];
if (cur) {
cout << 0 << " ";
bfs(cur);
}
cout << endl;
if (cur1) {
cout << 1 << " ";
bfs(cur1);
} else
return;
}
int main() {
int n, choice;
int binary;
init();
queue<int> mine;
std::cin >> n;
for (int i = 0; i < n; i++) {
while (!mine.empty()) mine.pop();
std::cin >> choice;
if (choice == 2) {
std::cin >> choice;
while (choice > 0) {
binary = choice % 2;
choice = choice / 2;
mine.push(binary);
}
insert(mine);
} else if (choice == 1)
plus_one();
cout << add() << endl;
}
return 0;
}