AcWing 143. 最大异或对
原题链接
简单
作者:
acw_yxy
,
2020-11-03 13:10:53
,
所有人可见
,
阅读 317
C++ 代码
// 普通做法时间复杂度为O(n2)
// trip字符串查找树,变为O(n)
// 时间复杂度为O(32n)+ O(32n)
#include <iostream>
#include <vector>
using namespace std;
const int N = 32 * 1e5 + 10;
int trip[N][2];
int idx = 0;
vector<int> res;
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
// 构建一个用每一个二进制位构成的树
int m, temp;
cin >> m;
for(int i = 0; i < m; i++)
{
cin >> temp;
res.push_back(temp);
int p = 0;
for(int i = 30; i >= 0; i--)
{
// 0代表根节点
if(!trip[p][temp >> i & 1]) trip[p][temp >> i & 1] = ++idx;
p = trip[p][temp >> i & 1];
}
}
int maxNum = 0;
// 查询
for(int i = 0; i < m; i++)
{
int x = res[i];
int p = 0;
int ans = 0;
for(int i = 30; i >=0; i--)
{
int s = x >> i & 1;
if(trip[p][!s])
ans += 1 << i, p = trip[p][!s];
else
p = trip[p][s];
}
maxNum = max(maxNum, ans);
}
cout << maxNum;
return 0;
}