在给定的 N 个整数 A1,A2……AN...... 中选出两个进行 xor(异或)运算,得到的结果最大是多少?
思路1:暴力解法
假设最大异或值为max_xor = 0,直接遍历异或所有数,不断更迭max_xor
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n = 0;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
int max_xor = 0;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
max_xor = std::max(nums[i] ^ nums[j], max_xor);
}
}
cout << max_xor << endl;
return 0;
}
思路2:字典树解法
异或:相同为0,不同为1
最大异或理想状态,所有二进制为为1,
将所有数的二进制存入字典树
假设最大异或值为0,即二进制为全为0
遍历数,用该数的二进制位上的数与其余每一个数的二进制位上的数异或,如果为1,则更替max_xor中对应二进制位数上的数字为1,然后让该max_xor与上一次最大max_xor比较,得出最大异或值
代码如下:
#include<bits/stdc++.h>
using namespace std;
struct TrieNode{
TrieNode* child[2];
TrieNode(){
child[0] = nullptr;
child[1] = nullptr;
};
};
void insert(TrieNode* root, int num){
TrieNode* curr = root;
for(int i = 31; i >= 0; i--){
int bit = num >> i & 1;
if(curr->child[bit] == nullptr){
curr->child[bit] = new TrieNode();
}
curr = curr->child[bit];
}
}
int findMaxXOR(TrieNode* root, int num) {
TrieNode* curr = root;
int result = 0;
for (int i = 31; i >= 0; i--) {
int bit = (num >> i) & 1;
int oppositeBit = 1 - bit;
if (curr->child[oppositeBit] != nullptr) {
result |= (1 << i);
curr = curr->child[oppositeBit];
} else {
curr = curr->child[bit];
}
}
return result;
}
int main() {
int N;
cin >> N;
vector<int> nums(N);
for (int i = 0; i < N; i++) {
cin >> nums[i];
}
TrieNode* root = new TrieNode();
int max_xor = 0;
for (int num : nums) {
insert(root, num);
int xor_result = findMaxXOR(root, num);
max_xor = max(max_xor, xor_result);
}
cout << max_xor << endl;
return 0;
}