今天可爱的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

这篇博客介绍了如何使用字典树高效地解决异或最大化的问题。Mayuyu提出了一个数组和询问的场景,要求在每个询问中找到一个数,使其与询问数的异或值最大。通过构建深度为32的字典树,可以将时间复杂度降低到O(32*m)。博客还提供了两个具体问题的链接和分析,包括找到数组中两个数的最大异或值和选择数组前缀与后缀的最大异或值。解决这些问题的关键在于理解异或的性质,并利用字典树进行快速查找。
最低0.47元/天 解锁文章
4478

被折叠的 条评论
为什么被折叠?



