博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
csu1216( Trie )
阅读量:7315 次
发布时间:2019-06-30

本文共 1765 字,大约阅读时间需要 5 分钟。

题意

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

分析

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

code

#include
#include
#include
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;}

转载于:https://www.cnblogs.com/ftae/p/7277149.html

你可能感兴趣的文章
ip source route
查看>>
2015年终总结
查看>>
squid实现反向代理!!!
查看>>
.NET的Ajax请求数据提交
查看>>
openssl的加密、解密以及构建私有CA
查看>>
【Python基础 08】函数基础
查看>>
MySQL查找SQL耗时瓶颈SHOW profiles
查看>>
Myeclipse优化配置
查看>>
UIView中的坐标转换
查看>>
BZOJ2215[Poi2011]Conspiracy——2-SAT+tarjan缩点
查看>>
MyBatis学习总结(13)——Mybatis查询之resultMap和resultType区别
查看>>
学习shell脚本:一个简单的shell脚本
查看>>
RabbitMQ学习总结(2)——安装、配置与监控
查看>>
解决虚拟机迁移后的MAC地址问题
查看>>
Oracle网络公开课《文件系统迁移数据库到ASM存储》
查看>>
移动端mini mvvm框架实现
查看>>
thinkphp下配置和使用阿里云redis
查看>>
OpenStack Swift Replication
查看>>
Exchange Server 2007迁移Exchange Server 2010 (6) ---部署Exchange2010 服务器前
查看>>
OPNsense用户手册-系统运行状况和循环数据
查看>>