AcWing 143. 最大异或对

https://www.acwing.com/problem/content/145

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 100010;
int n;
int a[N];

class TrieNode {
public:
    TrieNode() {};
    TrieNode* children[2];
};

class Trie {
public:
    Trie() {
        root = new TrieNode;
    }

    void insert(int x) {
        TrieNode* cur = root;
        for (int i = 30; i >= 0; i--) {
            int c = x >> i & 1;
            if (!cur->children[c]) {
                cur->children[c] = new TrieNode;
            }
            cur = cur->children[c];
        }
    }

    int search(int x) {
        TrieNode* cur = root;

        int res = 0;
        for (int i = 30; i >= 0; i--) {
            int c = x >> i & 1;
            if (cur->children[!c]) {
                res += 1 << i;
                cur = cur->children[!c];
            } else if (cur->children[c]) {
                cur = cur->children[c];
            } else {
                break;
            }
        }
        return res;
    }
private:
    TrieNode* root;
};

int run() {
    Trie trie;
    int res = 0;
    for (int i = 0; i < n; i++) {
        trie.insert(a[i]);
        res = max(res, trie.search(a[i]));
    }

    return res;
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    cout << run() << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/polystyrene/p/10796811.html

时间: 2024-10-01 11:42:17

AcWing 143. 最大异或对的相关文章

AcWing 143. 最大异或对 (异或性质,Trie)

? ? ? 刚开始WA了,数组又开小了,,关于字典树大小的问题,**考虑如果每一个字符都能生成新结点,那么字典树大小就是MAXN*LEN,本题目中数据是1<<31的范围,算上0位**就是32位长度字符串,即MAXN*32: 哦对还看到大佬写的是边插入边查询,这点没想到. #define int ll int a[MAXN]; int tot; int son[MAXN*32][2]; void build(int x) { int p=0; for(int k=32;k>=0;--k)

143. 最大异或对

在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N. 第二行输入N个整数A1A1-ANAN. 输出格式 输出一个整数表示答案. 数据范围 1≤N≤1051≤N≤105,0≤Ai<2310≤Ai<231 输入样例: 3 1 2 3 输出样例: 3 思路: 每个数散成二进制存进tire树里边,找能和当前二进制xor成1的最大数字取最大值,只需要从跟走到叶节点就可以找到和当前数字最大的数了,这样的话每个数字最多

143. 最大异或对(Trie树存整数+二进制)

在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N. 第二行输入N个整数A1A1-ANAN. 输出格式 输出一个整数表示答案. 数据范围 1≤N≤1051≤N≤105,0≤Ai<2310≤Ai<231 输入样例: 3 1 2 3 输出样例: 3 暴力做法:O(n^2) import java.util.Scanner; public class Main{ static int a[]=new int[1

暑假集训 - 8.5 总结

学习内容:KMP + 字典树 + 位运算 完成题数:5题 看书情况:11页 做题总结: 杭电多校第五场:https://www.cnblogs.com/buhuiflydepig/p/11303968.html AcWing 141:https://www.cnblogs.com/buhuiflydepig/p/11304878.html HDU 1711:https://www.cnblogs.com/buhuiflydepig/p/11305033.html AcWing 142:https

【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和

题意:给出N个数,M个操作.操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和.n,m<=100000,ai<=1000 题解: 当年(其实也就是今年)做不出来的题..D1T1啊... 因为ai<=1000,我们可以拆位处理.拆成10个二进制位,每位开1棵线段树. 对于每个节点,维护: d:这段区间的异或和 L[0],L[1]:子区间一定从左端点开始,异或和为0,1的子区间分别有多少个 R[0],R[1]:子区间一定从右端点开始,异或和为0,1的

SWUST OJ 东6宿舍灵异事件(0322)

东6宿舍灵异事件(0322) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 88 Accepted: 31 Description 将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信.但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你. 提供两种组合方式: A&B:代表A和B都为真的时候,A和B组合

Trie树/字典树题目(2017今日头条笔试题:异或)

1 /* 2 本程序说明: 3 4 [编程题] 异或 5 时间限制:1秒 6 空间限制:32768K 7 给定整数m以及n各数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个. 8 输入描述: 9 第一行包含两个整数n,m. 10 11 第二行给出n个整数A1,A2,...,An. 12 13 数据范围 14 15 对于30%的数据,1 <= n, m <= 1000 16 17 对于100%的数据,1 <= n, m,

AcWing&#160;164.&#160;可达性统计

给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 输出共N行,表示每个点能够到达的点的数量. 数据范围 1≤N,M≤30000 显然可以用拓扑排序+状态压缩来做, 用一个n位的二进制数存每一个f[x], 其中第i位是1表示x能到i,0则不能到i, 这样就相当于存在x 到 y的一条边,f[x] |= f[y], 再预处理处拓扑序, 反向枚举, 最后判断每个f[i]中的个数,

AcWing 数据备份

AcWing 数据备份 Description 你在一家IT公司为大型写字楼或办公楼的计算机数据做备份. 然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣. 已知办公楼都位于同一条街上,你决定给这些办公楼配对(两个一组). 每一对办公楼可以通过在这两个建筑物之间铺设网络电缆使得它们可以互相备份. 然而,网络电缆的费用很高. 当地电信公司仅能为你提供 K 条网络电缆,这意味着你仅能为 K 对办公楼(总计2K个办公楼)安排备份.