最大异或对
题目链接:最大异或对
题目描述

解题思路
我们可以将每个数拆分成二进制,存入字典树中。
二进制数字越高位换算成十进制数字就越大,所以我们要从高位到低位存数,对于不够 31 31 31 位的数字补全。
题目要求异或后的数尽量大,换句话说就是要在查找的时候尽量往不同的数字去找,最后取 max \max max 值就可以了。
code
#include<iostream>
#include<cstdio>
using namespace std;
int n,ans;
int a[10000000][2],tot=1;
void in(int t)
{
int now=1;
for(int i=31;i>=0;i--)
{
int c=(t>>i)&1;
if(!a[now][c])
a[now][c]=++tot;
now=a[now][c];
}
}
void fd(int t)
{
int now=1,s=0;
for(int i=31;i>=0;i--)
{
int c=!((t>>i)&1);
if(a[now][c])
s+=(1<<i);
else
c=!c;
now=a[now][c];
}
ans=max(ans,s);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int t,tt=0;
scanf("%d",&t);
fd(t);
in(t);
}
cout<<ans<<endl;
}

本文介绍了如何运用字典树数据结构解决最大异或对问题。通过将数字拆分为二进制并存储在字典树中,从高位到低位遍历寻找异或值最大的配对,最终得到最大异或结果。代码中展示了具体的实现过程,包括插入和查找操作。
210

被折叠的 条评论
为什么被折叠?



