[Acwing] 143. 最大异或对 Tire树

前言

一看就是Tire树 一做就不会

思路

常规暴力解法:
O n 2 n^2 n2 枚举出 所有选法取最大即可

使用Tire树优化第二层循环:
O n l o g n nlogn nlogn , 使用Tire存放每个数的 二进制数 即 T i r e [ N ∗ 31 ] [ 2 ] Tire[N*31][2] Tire[N31][2]

然后我们在枚举每一个 a [ i ] a[i] a[i]的时候,

  • 如果 a [ i ] a[i] a[i]是1 那么我们就走 0
  • 反之则然

因此这样子就保证了对于每个 a [ i ] a[i] a[i]我们都可以取得最大值

CODE

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10,M=3100010;
int n;
int a[N],son[M][2],idx;

void insert(int x)
{
    int p = 0;

    for(int i=30;i>=0;i--)
    {
        int &s = son[p][x>>i&1];

        if(!s)
        s = ++idx;

        p = s;
    }
}

int search(int x)
{
    int p = 0 ,res = 0;
    for(int i =30;i>=0;i--)
    {
        int s = x>>i&1;
        
        if(son[p][!s])
        {
            res += 1<<i;
            p = son[p][!s];
        }else p = son[p][s];
    }
    return res;
}



void solve()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        insert(a[i]);
    }
    int res = 0;
    for(int i=0;i<n;i++)
    res =  max(res,search(a[i]));
    cout<<res<<endl;
}

int main()
{
    ios::sync_with_stdio(false);
    solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值