最大异或对 tire树

在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?

输入格式
第一行输入一个整数N。

第二行输入N个整数A1~AN。

输出格式
输出一个整数表示答案。

数据范围
1≤N≤105,
0≤Ai<231
输入样例:
3
1 2 3
输出样例:
3
直接暴力的复杂度是n²肯定是要超时的 ,知道要用字典树那么就把每个数化成二进制保存啦,因为是异或运算,相同为0不同为1 ,所以在每个节点要优先向相反位走,相反位没路了再向相同为走,为了实现最大化要从高位向低位走(wa了好几次!!!)

#include<iostream>
#include<map>
using namespace std;
const int maxn=1e5+100;
int ed[maxn*32][5],idx=1;//理论上一个数有32位 实际用不到maxn*32
void insert(int x)
{
    int p=1;
    for(int i=31;i>=0;i--)
    {
        int y=x>>i&1;//取出每一位的值(二进制)
        if(!ed[p][y]) ed[p][y]=++idx;
        p=ed[p][y];
    }
}
int query(int x)
{
    int p=1,i=31,ans=0;
    while(i>=0)
    {
        int y=x>>i&1;
        if(ed[p][1-y]) ans+=1<<i,p=ed[p][1-y];//优先考虑相反位
        else  p=ed[p][y];
        i--;
    }
    return ans;
}
int main()
{
    // ios::sync_with_stdio(false);
    // cin.tie(0);
    // cout.tie(0);
    int n,ans=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        insert(x);
        ans=max(ans,query(x));
    }
    cout<<ans<<endl;
    return 0;
}
发布了26 篇原创文章 · 获赞 3 · 访问量 619

猜你喜欢

转载自blog.csdn.net/qq_45288870/article/details/104099968