题目传送门

一、分析思路

//最大异或对,用暴力是超时的
for(int i=0;i<n;i++)
   for(int j=0;j<i;j++)
      res=max(res,a[i]^a[j]);
  cout<<res<<endl;

结果不出意外,\(TLE\),只能想办法进行优化

题解思路:

1、将整数解析为二进制数,即有符号整数,\(31\)位,就是\(0-30\),按\(Trie\)树进行存储。 整数的\(Trie\)树存储

2、每个数字的每一个二进制位,需要从高位到低位,即for(int i = 30; i >= 0; i--),想像一下你在构建一个\(Trie\)树,那么根\(root\)就是最高位,然后一路走到\(31\)位,就是最低位。

3、每个数字想要找到与自己形成最大异或值的另一个数字,我们现在已经把它们保存到\(Trie\)树里了,那怎么找呢?什么样的两个数字才是最大异或值的对呢?就是每一位完全相反的就肯定是最大的异或对!那如果某一位不相反呢?这就是退而求其次的思路了,我们尽量从左到右找出与当前数字本位相反的路径,如果存在,就继续探索,如果不存在,那就使用一样的本位值。这样下来,到\(31\)位,就可以找到和自己匹配最大的异或值。

总结一下
(1)\(Trie\)里可以用来保存数字,数字需要通过二进制(由高位到低位)进行保存。

(2)增加一个数字进来,其实就是增加了一个层级为\(31\)级的“模拟字符串”。

(3)放入一个数字,那么它肯定会在任意一级(共\(31\)级)存在一边,另一边可能存在,也可能不存在。存在是因为另一个数字在那边。也可能没有数字在另一边。

二、C++ 代码

#include<bits/stdc++.h>

using namespace std;

const int N = 1e6 + 10;
const int M = N * 32;

int n, res;
int a[N];
int tr[M][2];
int idx;

//构建数字二进制位的Trie树
void insert(int x) {
    int p = 0;
    for (int i = 30; i >= 0; i--) {
        int u = x >> i & 1;//取出当前位的值
        if (!tr[p][u])tr[p][u] = ++idx;//构建Trie树
        p = tr[p][u];
    }
}

//所谓与x异或最大,就是利求在高位上尽量不一样,如果找不到不一样的,就只能找一样的,下一个继续优先找不一样的
//在Trie树中查找到与x异或最大的数
int query(int x) {
    int p = 0, ans = 0;
    for (int i = 30; i >= 0; i--) {
        int u = x >> i & 1;     //取出x的当前二进制位
        if (tr[p][!u]) {       //如果存在可以异或的路可以走的话,尽量先走
            p = tr[p][!u];
            ans = (ans << 1) + !u; //还原二进制数字为十进制
        } else {
            p = tr[p][u];      //否则只能走与自己本位一样的路线
            ans = (ans << 1) + u;  //还原二进制数字为十进制
        }
    }
    return ans;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i], insert(a[i]);

    //找出每个数字的最大异或对,与异或值
    for (int i = 1; i <= n; i++) {
        int t = query(a[i]);//取出与a[i]异或值最大的数字t
        //打擂台,看看哪组异或值最大
        res = max(res, a[i] ^ t);
    }
    printf("%d\n", res);
    return 0;
}

相关文章:

  • 2021-11-06
  • 2021-11-28
  • 2021-09-28
  • 2021-11-23
  • 2021-10-08
  • 2021-12-30
  • 2021-09-17
  • 2022-01-14
猜你喜欢
  • 2022-12-23
  • 2022-02-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-22
  • 2021-08-06
相关资源
相似解决方案