csu1216

题意

给定一些数,求这些数中两个数的异或值最大的那个值。

分析

转化成二进制数存入字典树,比如说要查询 \(0011\) ,显然和 \(1100\) 结合最优,所以我们直接在字典树上寻找 \(1100\) ,如果某一位没找到不管它继续往下找,因为我们是从高到低位存的,所以找得到的一定是最优的。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
const int MAXN = 2e6 + 10;
int n;
int ans;
int bit[32];
struct Trie {
int nxt[MAXN][2];
int root, L;
int newnode() {
nxt[L][0] = nxt[L][1] = 0;
return L++;
}
void init() {
L = 1;
root = newnode();
}
void insert(int x) {
int tmp[32];
memset(tmp, 0, sizeof tmp);
int c = 0;
while(x) {
tmp[c++] = x % 2;
x >>= 1;
}
int now = root;
for(int i = 30; i >= 0; i--) {
int d = tmp[i];
if(!nxt[now][d]) nxt[now][d] = newnode();
now = nxt[now][d];
}
}
void query(int x) {
int tmp[32];
memset(tmp, 0, sizeof tmp);
int c = 0;
while(x) {
tmp[c++] = !(x % 2);
x >>= 1;
}
for(int i = c; i <= 30; i++) {
tmp[i] = 1;
}
int now = root;
int res = 0;
for(int i = 30; i >= 0; i--) {
int d = tmp[i];
if(nxt[now][d]) res += bit[i];
else d = !d;
now = nxt[now][d];
}
ans = max(ans, res);
}
}trie;
int main() {
bit[0] = 1;
for(int i = 1; i < 31; i++) {
bit[i] = bit[i - 1] * 2;
}
while(~scanf("%d", &n)) {
trie.init();
ans = 0;
for(int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
trie.query(x);
trie.insert(x);
}
printf("%d\n", ans);
}
return 0;
}

csu1216( Trie )的更多相关文章

  1. 【python】Leetcode每日一题-前缀树(Trie)

    [python]Leetcode每日一题-前缀树(Trie) [题目描述] Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的 ...

  2. LA3942-Remember the Word(Trie)

    题意: 有s个不同的单词,给出一个长字符串把这个字符串分解成若干个单词的连接(可重复使用),有多少种分解方法 分析: dp[i]表示i开始的字符串能分解的方法数 dp[i]=sum(dp[i+len( ...

  3. HDU 1671 Phone List (Trie)

    pid=1671">Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  4. hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)

    统计难题Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submis ...

  5. 字典树(Trie)的java实现

    一.定义 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用 ...

  6. HDU 4825-Xor Sum(trie)

    题意: 给你一组数,开始询问给一个数  求组中与该数异或值最大的数. 分析:根据异或的特点 要想得到的异或值最大 尽可能的让两个数的每位都相反 先把给定的一组数建树,数的最后一位对应的节点保存这个数的 ...

  7. 【UER #1】跳蚤OS(Trie)

    跳蚤OS 是跳蚤国自主研发的功能强大的操作系统. 跳蚤OS的文件系统与普通的文件系统类似,是个文件夹套文件夹的结构.文件系统根目录称为“//”.我们可以用文件路径来表明文件所在的位置,比如“/flea ...

  8. UVA - 11732 "strcmp()" Anyone? (trie)

    https://vjudge.net/problem/UVA-11732 题意 给定n个字符串,问用strcmp函数比较这些字符串共用多少次比较. strcmp函数的实现 int strcmp(cha ...

  9. hihoCoder 1014 Trie树 (Trie)

    #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho是一对好朋友.出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮 ...

随机推荐

  1. JS格式化 /Date(xxxxxx)/的日期类型

    //用来转换/Date(xxxxxx)/类型的JSON日期为要求的日期格式字符串String.prototype._formatJsonDate = function (format) { var s ...

  2. 【题解】NOI2015寿司晚宴

    想好久啊+不敢写啊……但果然人还是应当勇敢自信,只有坚定地去尝试,才会知道最后的结果.1A真的太开心啦,不过好像我的做法还是比较复杂的样子……理解起来应该算是比较容易好懂的类型,大家可以参考一下思路~ ...

  3. [SDOI2011]消防/[NOIP2007] 树网的核

    消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家最兴旺的 ...

  4. ACM模板~求逆序对的个数

    #include <map> #include <set> #include <cmath> #include <ctime> #include < ...

  5. 关闭listener监听日志

    有几次碰到过由于监听日志文件大小达到几G,使得在连接时非常慢,像hang住一样,windows下的监听日志达到4G限制,后续连接如果无法写监听日志,就会产生TNS-12537报错,可以通过关闭写监听日 ...

  6. nginx 静态文件支持跨域访问权限

    一.原生态 location ^~ /repurchase-web/ {          alias /var/www/webapps/repurchase-web/;        } 二.支持跨 ...

  7. 浏览器 连不上网 (3):DNS 服务器问题

    解决:设置一下DNS服务器的地址 步骤: 打开网络和共享中心(网络和 Internet设置)-> 更改适配器 -> 双击我们连接的 无线网(WiFi式) 或 以太网(网线式): 从出现的窗 ...

  8. 【LuoguP1169 bzoj1057】[ZJOI2007]棋盘制作

    首先把矩阵转化一下,把横纵坐标和为偶数点的值取反,这样就转化成求最大的'0'或'1'矩阵. 这道题每个数字是在格子内的,不能在边界包含障碍点. 求最大的0矩阵时,把1作为障碍点.求1同理. 然后求最接 ...

  9. POJ2154 Color

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10322   Accepted: 3360 Description Bead ...

  10. 【Atcoder】AGC 016 C - +/- Rectangle

    [题意]给定大矩阵的边长H和W,给每格填数(<=|10^9|),要求大矩形总和为正数,而每个h*w的小矩形总和为负数,求构造方式. [算法]数学 [题解]结论题. ★当h|H&& ...