The XOR Largest Pair

https://loj.ac/problem/10050

题目描述

??给出\(n\)个整数,求选出两个数使它们的异或值最大。

思路

??解决异或问题也是字典树的常用作用之一。我们考虑对于一个数\(x\),我们如何求出它的异或值最大的另一个数。异或的定义是每一位相同为\(0\),不同为\(1\),所以我们只需要查找二进制下每一位都和\(x\)不同的数。而这道题实际给定范围,那么我们可以考虑建一棵字典树,存二进制每一位的值,对于查找的数\(x\),我们只需要从高位往低位枚举,尽量找每一位与这个数这一位不同即可。

代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
int ch[MAXN<<5][3],tot,a[MAXN];
void insert(int x)
{
    int u=1;
    for(int i=1<<30;i;i>>=1)
    {
        int num=(x&i)?1:0;
        if(!ch[u][num])ch[u][num]=++tot;
        u=ch[u][num];
    }
}
int find(int x)
{
    int ans=0;
    int u=1;
    for(int i=1<<30;i;i>>=1)
    {
        int num=(x&i)?0:1;
        if(ch[u][num])
        {
            ans+=i;
            u=ch[u][num];
        }
        else u=ch[u][!num];
    }
    return ans;
}
int main()
{
    int n;
    tot=1;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        insert(x);
        a[i]=x;
    }
    int ans=0;
    for(int i=1;i<=n;i++)
        ans=max(ans,find(a[i]));
    printf("%d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/fangbozhen/p/11788231.html

时间: 2024-10-20 00:48:11

The XOR Largest Pair的相关文章

The XOR Largest Pair之二

Description今天小W用了1s不到的时候完成了这样一个题:在给定的N个整数 A_1,A_2,…,A_N中选出两个进行异或运算,得到的结果最大是多少?正当他志得意满时,L老师亮出了另一个题:给你1000个数字a1到a1000,从其中选出三个数字ai,aj,ak(1<=i,j,k<=1000,且i,j,k互不相同)满足(ai+aj)xor ak的值最大小W顿时迷茫了......... Input第一行给出数字N,接下来N行,每行一个数字Output如题Sample Input41234Sa

The XOR Largest Pair(Tire字典树应用)

题目链接:传送门 思路:建立一个32位的字典树,对每一个要插入的数字查找它异或的最大值(就是尽量全部二进制的值都相反), 然后获得两个数异或的最大值. #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 1e5+10; int ch[maxn*32][2],tot; void Insert(int x) { int i,u=1,c; for

【Trie】The XOR Largest Pair

[题目链接] https://loj.ac/problem/10050 [题意] 给出n个数,其中取出两个数来,让其异或值最大. [题解] 经典的01字典树问题. 首先需要把01字典树建出来. 然后对于每一个串都跑一遍.如果存在当前位 不同的 节点,就往那里跑,否则顺着跑. 一切尽在代码中. [代码] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 1e5+10;

[GeeksForGeeks] Find the largest pair sum in an unsorted array

Given an unsorted array, find the largest pair sum. Solution 1. O(n*logn) runtime, using sorting Solution 2. O(n) runtime, using heapify (max priority queue) Option 1. Use Java priority queue API, easy to implement but uses O(n) extra memory. Option

0x16 Trie

这章刷的真带劲 嘿嘿 裸题 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; struct Trie { int c,w[30]; Trie(){c=0;memset(w,0,sizeof(w));} }tr[1100000];i

POJ 3764 - The xor-longest Path - [DFS+字典树变形]

题目链接:http://poj.org/problem?id=3764 Time Limit: 2000MS Memory Limit: 65536K Description In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of edges on p: $_{xor}length(p) = \bigoplus_{e \in p}w(e)$ $\oplus$

『字典树 trie』

字典树 (trie) 字典树,又名\(trie\)树,是一种用于实现字符串快速检索的树形数据结构.核心思想为利用若干字符串的公共前缀来节约储存空间以及实现快速检索. \(trie\)树可以在\(O((n+m)*len)\)解决形如这样的字符串检索问题: 给定\(n\)个字符串,再给定\(m\)个询问,每次询问某个字符串在这\(n\)个字符串中出现了多少次 特点 \(trie\)树最显著的特点是,当它存储的若干个字符串有公共前缀时,它将不会重复存储. 与其他树形数据结构不同的是,\(trie\)树

D - Matrices with XOR property 二维树状数组+pair

Imagine A is a NxM matrix with two basic properties 1) Each element in the matrix is distinct and lies in the range of 1<=A[i][j]<=(N*M) 2) For any two cells of the matrix, (i1,j1) and (i2,j2), if (i1^j1) > (i2^j2) then A[i1][j1] > A[i2][j2] ,

(单调栈)poj-2559 Largest Rectangle in a Histogram

A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the