今天可爱的Mayuyu会带领大家来学习一个东西,那就是异或最大,Mayuyu的问题描述如下。
题目:给定一个数组a[],再给出m个询问,每个询问一个数x,在a[]中找出一个数y,使得x与y的异或值最大。
分析:最直观的思路就是对于每一个询问,直接暴力在数组a[]中比较,找最大的,但这样做的时间复杂度会很大。
我们有一个很好的解法,那就是字典树,假设所有的数字范围均在int内,那么就可以建立深度为32的字典树
即可,所以总的时间复杂度为O(32*m)。
建好字典树后,从根节点往下遍历一遍就行了,先对x按位取反,尽量走相同的节点,如果不存在就忽略。
代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
class Trie
{
public:
Trie *next[2];
Trie()
{
memset(next,NULL,sizeof(next));
}
};
Trie *root;
void Insert(LL n)
{
Trie *p = root;
for(int i=31;i>=0;i--)
{
int id = (n >> i) & 1;
if(p->next[id] == NULL)
p->next[id] = new Trie();
p = p->next[id