【Trie】CH 1602 The XOR Largest Pair

链接

http://contest-hunter.org:83/contest/0x10%E3%80%8C%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E3%80%8D%E4%BE%8B%E9%A2%98/1602%20The%20XOR%20Largest%20Pair

大意

给定 n 个数,从中选出任意两个数,使得它们的异或值最大

思路

异或最大,那么我们尽量使他们每一位都不同,根据这个特性,我们可以将它们拆分成二进制,然后按位查找

例如要找到一个数与1101异或起来最大,那么我们就去找0010,这样子它们的异或值就是最大的

代码

#include<cstdio>
#include<algorithm>
using namespace std;
int trie[8000001][2],tot,n,a,ans;
inline void insert(register int x)//插入
{
    int p=0;
    for(register int k=31;k>=0;k--)
    {
        int id=(x>>k)&1;//找到这位是0还是1
        if(!trie[p][id]) trie[p][id]=++tot;
        p=trie[p][id];
    }
    return;
}
inline int search(register int x)//尽量查找x的反串
{
    int p=0,ans=0;
    for(register int k=31;k>=0;k--)
    {
        int id=(x>>k)&1,o=id^1;
        if(trie[p][o]) {p=trie[p][o];ans=ans<<1|1;}
        else if(trie[p][id]) {p=trie[p][id];ans<<=1;}
    }
    return ans;
}
signed main()
{
    scanf("%d",&n);
    for(register int i=1;i<=n;i++)
    {
        scanf("%d",&a);
        ans=max(ans,search(a));
        insert(a);
    }
    printf("%d",ans);
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81777531
今日推荐