Trie数题目

题目1:最大异或对

活动 - AcWing

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

解题

异或操作是指,相同为0,不同为1。

由于二进制的特殊性,因此不存在牺牲某一个高位的1,换取更多低位的1,使得最后结果更大的可能性,因此不需要回溯。

要使得到的结果尽可能大,就是要让结果中高位上的的1尽可能多。

对于trie树的每个结点,有0和1两个分支。我们对每个数的二进制数进行从高位到低位的遍历,每遍历到一个位置,先判断当前树上这个位置值取非(!),如果非值存在,则沿着非值方向走下去,并将结果的对应位置取1;若不存在,则沿原方向走下去,结果的对应位置取0。

#include
using namespace std;
const int N=1e5+10,M=3000000;
int son[M][2],idx=0;
int a[N];
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 query(int x)
{
    int p=0;
    int res=0;
    for(int i=30;i>=0;i--)
    {
        int t=x>>i&1;
        if(son[p][!t])
        {
            res+=1<

你可能感兴趣的:(数据结构,算法,c++,数据结构)