CSU-1216: 异或最大值-trie-01字典树

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1216

Description

给定一些数,求这些数中两个数的异或值最大的那个值

Input

第一行为数字个数n,1 <= n <= 10 ^ 5。接下来n行每行一个32位有符号非负整数。

Output

任意两数最大异或值


这个问题可以用01-字典树很好地解决

即把所有数先按二进制从高到低位看成字符串插入trie。

枚举每个数,作为X,然后去trie里尽可能找每一位与X的二进制位相反的数,不断更新答案


复杂度 建树O(N*32) 

查询O(n*32)

RunID User Problem Result Memory Time Language Code Length Submit Time
200255 liuyuhong
1216
Accepted
3648
140
C++/Edit 1930 B 2016-08-10 02:38:44


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define inf 2147483647
const int maxnode = 100005*32;

int len;
struct trie
{
    int ch[maxnode][2];
   // int val[maxnode];
    int sz;
    void init()
    {
        sz=1;
    //    val[0]=0;		//可不需要
        memset(ch[0],0,sizeof(ch[0]));
    }
    void insert(int s )
    {
        int u=0,n=31,i;
        for (i=0; i


你可能感兴趣的:(数据结构,字典树,xor异或最大值)