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 Input
4
1
2
3
4
Sample Output
7
HINT
(1+2)xor4=7

sol:先将所有数字加入Trie,然后枚举前两个数字i和j,将其和拿到Trie里和第三个数字k进行异或运算。注意,三个数要各不相同,因此我们到Trie里做异或前,要从Trie里删掉i和j,异或结束后,再把i和j加回去。删除时,将i和j的各结点出现的次数-1,插入时,将i和j的各结点出现的次数+1。

代码如下:

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 int a[2005],ch[35*1005][2],val[35*1005];
 5 int tol;
 6
 7 void insert(ll x,ll p)
 8 {
 9     int u=0;
10     for(int i=31;i>=0;i--)
11     {
12         int v=(x>>i)&1;
13         if(!ch[u][v])
14             ch[u][v]=tol++;
15         u=ch[u][v];
16         val[u]+=p;
17     }
18 }
19
20 ll query(ll x)
21 {
22     int u=0;
23     ll ans=0;
24     for(int i=31;i>=0;i--)
25     {
26         int v=(x>>i)&1;
27         if(val[ch[u][v^1]])
28             u=ch[u][v^1],ans=ans<<1|1;
29         else
30             u=ch[u][v],ans=ans<<1;
31     }
32     return ans;
33 }
34
35 int main()
36 {
37     int T;
38     scanf("%d",&T);//T组数据
39     while(T--)
40     {
41         tol=1;
42         int n;
43         scanf("%d",&n);//每组n个数
44         for(int i=0;i<=n*32;i++) //建立整个TRIE
45             ch[i][0]=ch[i][1]=val[i]=0;
46         for(int i=1;i<=n;i++) //将每个数字加入到TRIE中
47         {
48             scanf("%d",&a[i]);
49             insert(a[i],1);//插入,将每个结点出现的次数增加1
50         }
51         ll maxx=0;
52         for(int i=1;i<=n;i++)//枚举第一个数
53         {
54             for(int j=i+1;j<=n;j++)//枚举第二个数
55             {
56                 insert(a[i],-1); //删除A[i],a[j]
57                 insert(a[j],-1);//删除操作等于使用插入操作,将结点出现的次数-1
58                 maxx=max(maxx,query(a[i]+a[j]));
59                 //用a[i]+a[j]去异或Trie里的数,取最大值
60                 //因为不能为a[i]和a[j]本身,所以先删掉这两个数,异或完后再加回来
61                 insert(a[j],1);
62                 insert(a[i],1);
63             }
64         }
65         printf("%lld\n",maxx);
66     }
67     return 0;
68 }

原文地址:https://www.cnblogs.com/cutepota/p/12627902.html

时间: 2024-10-19 12:13:08

The XOR Largest Pair之二的相关文章

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;

The XOR Largest Pair

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

[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\)树

了解黑客的关键工具---揭开Shellcode的神秘面纱

ref:  http://zhaisj.blog.51cto.com/219066/61428/ 对于初期接触网络安全的人来说,Shellcode是很神秘的东西,对于网络攻击过程中的嗅探信息.漏洞剖析都是可以理解的,但真正利用漏洞入侵时,通过把一段二进制码送入后并执行,就可以获得目标机器的控制权,之后的事情是属于爱好者学习技术,还是黑客的行为,就看攻击者的一念之差了.Shellcode就好象神秘的武器,安全防护变得如此不堪一击.Shellcode究竟是什么样的程序?是什么特殊代码?如何才能学会编

PHP学习之[第04讲]PHP5.4 运算符、流程控制

一.运算符: 1.算数运算符:+.-.*./.%.++.-- 2.字符串运算符: <?php $str="string php100"; echo $str."web"; //输出结果string php100web echo $str.123; //输出结果string php100123 $str2="web"; echo $str.$str2; //输出结果string php100web ?> 3.赋值运算符:①=.②+=.③