码迷,mamicode.com
首页 > 其他好文 > 详细

The XOR Largest Pair (01Trie)

时间:2020-06-02 13:26:34      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:+=   code   name   ack   更改   异或运算   tput   main   str   

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

Input

第一行一个整数 N

第二行 N 个整数 Ai

Output

一个整数表示答案。

Example

样例输入

5

2 9 5 7 0

样例输出

14

Hint

对于 100%100% 的数据,1≤N≤105,0≤Ai<231。

01Trie,把每个数转化成32位的二进制串,insert函数不变,search函数里查找的时候优先沿着与带查找字符串当前位相反的字符指针向下访问,如果p为空的话就只能退而求其次访问与当前位相同的字符指针。

两个小坑:trie数组第一维一定要开的足够大,search函数里每一重循环记得保留原始的p(便于处理为空的情况)。

 

#include <bits/stdc++.h>
using namespace std;
int n,trie[100005*31][2],tot=1,ans=0;
vector<string>v;
int fpow(int a,int b)
{
    int ans=1;
    for(;b;b>>=1)
    {
        if(b&1) ans=ans*a;
        a=a*a;
    }
    return ans;
}
string tran(int num)
{
    string s;
    int i;
    for(i=0;i<32;i++)
    {
        if(num&(1<<i)) s="1"+s;
        else s="0"+s;
    }
    return s;
} 
void insert(string s)
{
    int p=1,k;
    for(k=0;k<32;k++)
    {
        int ch=s[k]-0;
        if(trie[p][ch]==0) trie[p][ch]=++tot;
        p=trie[p][ch];
    }
}
int search(string s)//返回最大的异或值 
{
    int k,p=1,num=0;
    for(k=0;k<32;k++)
    {
        int orip=p;
        p=trie[p][1-(s[k]-0)];//防止p被更改 
        if(p==0) 
        {
            p=trie[orip][s[k]-0];//退而求其次
        }
        else
        {
            num+=fpow(2,32-k-1);
        }
    }
    return num;
}
int main()
{
    cin>>n;
    int i;
    for(i=1;i<=n;i++)
    {
        int temp;
        scanf("%d",&temp);
        string ss=tran(temp);
        insert(ss);
        v.push_back(ss);
    } 
    for(i=0;i<v.size();i++)
    {
        ans=max(ans,search(v[i]));
    }
    cout<<ans<<endl;
    return 0;
}

 

The XOR Largest Pair (01Trie)

标签:+=   code   name   ack   更改   异或运算   tput   main   str   

原文地址:https://www.cnblogs.com/lipoicyclic/p/13030342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!