$$\color{red}{算法}\color{blue}{基础课}\color{purple}{笔记and题解}\color{green}{汇总}$$
笔记:
这题是$Trie$的拓展题,但是话说如果不看算法标签真的是看不粗来这是Trie……
根据本题的关键字“异或”,假设已经有一个插入完的$Trie$,不过是以二进制形式插入树的,然后要询问一次。
我们可以发现:每次循着相反的方向试着前进,如果可以则前进,否则走原来那条路。
最后访问到的数则是答案。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int trie[N * 32][2], t = 1, a[N], n, ans;
void insert(int x) {
int p = 1;
for (int i= 30; i >= 0; i--) {
int ch = x >> i & 1;
if (trie[p][ch] == 0) trie[p][ch] = ++t;
p = trie[p][ch];
}
}
int s(int x) {
int p = 1, ans = 0;
for (int i = 30; i >= 0; i--) {
int ch = x >> i & 1;
if (trie[p][ch ^ 1]) {
p = trie[p][ch ^ 1];
ans |= (1 << i);
}
else p = trie[p][ch];
}return ans;
}
int main() {
cin>>n;
for (int i= 1; i <= n; i++) {
cin>>a[i]; insert(a[i]);
ans = max(ans, s(a[i]));
}
cout<<ans;
}
为什么可以边插入边搜索呢?
因为a^b和b^a结果一样