Xor - Trie树
题目描述
求一棵带边权的树的一条最大 Xor 路径的值。这里的“路径”不一定从根到叶子结点,中间一段路径只要满足条件也可以。
输入格式
第一行,一个整数 N ,表示一颗树有 N 个节点,接下来 N-1 行,每行三个整数 a,b,c 表示节点 a 和节点 b 之间有条权值为 c 的边。
输出格式
输出仅一行,即所求的最大值。
样例数据 1
输入 [复制]
4
1 2 3
1 3 4
1 4 7
输出
7
备注
【数据范围】
对 40% 的输入数据 :数据退化为一条链;
另对 10% 的输入数据 :N≤1000;
对 100% 的输入数据 :1≤N≤100000, c≤231-1。
题目分析
套路
Xor多半是trie树(普通/可持久化)。
由于Xor的性质之 a ^ b ^ b = a, u与v之间路径的xor和就为sum[u] ^ sum[v](不必求lca)。
于是可以将每个点到根节点的路径xor和计算出来,再将每个点的sum由高位到低位插入到trie树中。
接下来扫描每个节点,对于当前节点的sum,从trie树根节点开始匹配,尽量向异或后为1的转移,取最大值即可。
code
#include<bits/stdc++.h>
using namespace std;
const int N = 100005, L = 35;
int n, ecnt, adj[N], go[N << 1], nxt[N << 1], len[N << 1], sum[N], ans = 0;
inline int read(){
int i = 0, f = 1; char ch = getchar();
for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
if(ch == '-') f = -1, ch = getchar();
for(; ch >= '0' && ch <= '9'; ch = getchar())
i = (i << 3) + (i << 1) + (ch - '0');
return i * f;
}
inline void wr(int x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) wr(x / 10);
putchar(x % 10 + '0');
}
struct node{
node *ch[2];
node(){}
inline void clean(){
ch[0] = ch[1] = NULL;
}
}pool[N * L], *root = NULL, *tail = pool;
inline void dfs(int u, int f){
for(int e = adj[u], v; e; e = nxt[e]){
if((v = go[e]) == f) continue;
sum[v] = sum[u] ^ len[e];
dfs(v, u);
}
}
inline int get(int s, int k){
return (s >>(k - 1)) & 1;
}
inline void insert(int s){
node *pos = root;
for(int i = 31; i >= 1; i--){
if(!pos->ch[get(s, i)])
(pos->ch[get(s, i)] = tail++)->clean();
pos = pos->ch[get(s, i)];
}
}
inline int getAns(int k){
int ret = sum[k];
node *pos = root;
for(int i = 31; i >= 1; i--){
if(pos->ch[get(sum[k], i) ^ 1]){
pos = pos->ch[get(sum[k], i) ^ 1];
ret |= (1 << (i - 1));
}
else{
pos = pos->ch[get(sum[k], i)];
ret ^= ((get(sum[k], i)) << (i - 1));
}
}
return ret;
}
inline void addEdge(int u, int v, int w){
nxt[++ecnt] = adj[u], adj[u] = ecnt, go[ecnt] = v, len[ecnt] = w;
}
int main(){
//freopen("xor.in", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
n = read();
for(int i = 1; i < n; i++){
int x = read(), y = read(), z = read();
addEdge(x, y, z);
addEdge(y, x, z);
}
dfs(1, 0);
(root = tail++)->clean();
for(int i = 1; i <= n; i++) insert(sum[i]);
for(int i = 1; i <= n; i++)
sum[i]=getAns(i),ans=max(ans,sum[i]);
wr(ans);
return 0;
}
Xor - Trie树的更多相关文章
- usaco6.1-Cow XOR:trie树
Cow XOR Adrian Vladu -- 2005 Farmer John is stuck with another problem while feeding his cows. All o ...
- 51nod 1295 XOR key (可持久化Trie树)
1295 XOR key 题目来源: HackerRank 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个长度为N的正整数数组A,再给出Q个查 ...
- 51nod 1295 XOR key | 可持久化Trie树
51nod 1295 XOR key 这也是很久以前就想做的一道板子题了--学了一点可持久化之后我终于会做这道题了! 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X ...
- HDU 5269 ZYB loves Xor I Trie树
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5269 bc:http://bestcoder.hdu.edu.cn/contests/con ...
- HDU 4825 Xor Sum (trie树处理异或)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- CodeForces979D:Kuro and GCD and XOR and SUM(Trie树&指针&Xor)
Kuro is currently playing an educational game about numbers. The game focuses on the greatest common ...
- Poj 3764 The xor-longest Path(Trie树+xor+贪心)
The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6455 Accepted: 1392 ...
- The XOR Largest Pair (trie树)
题目描述 在给定的 NN 个整数 A_1,A_2,--,A_NA1,A2,--,AN 中选出两个进行xor运算,得到的结果最大是多少?xor表示二进制的异或(^)运算符号. 输入格式 第一行输入 ...
- BZOJ5338 [TJOI2018] Xor 【可持久化Trie树】【dfs序】
题目分析: 很无聊的一道题目.首先区间内单点对应异或值的询问容易想到trie树.由于题目在树上进行,case1将路径分成两段,然后dfs的时候顺便可持久化trie树做询问.case2维护dfs序,对d ...
随机推荐
- web前端背景介绍
Internet:是一个全球性的计算机互联网络,中文名称“因特网”.“国际互联网”.“网际网”等等: Internet提供的服务:http.ftp.Telnet.email.www.bbs等等: 基本 ...
- upf用到的工具
emulator : PXP zebu simulator :
- nginx+tomcat 架构 HttpServletRequest.getScheme()获取正确的协议
http://blog.csdn.net/ofofw/article/details/46791447
- 启动Tomcat,startup.bat一闪而过的解决办法
1.打开命令行:win+R --> cmd2.将解压后的tomcat\bin\startup.bat文件拖到控制台窗口中,回车. 这样就可以看到错误信息的提示,根据提示修改即可.
- js的AJAX请求有关知识总结
什么是AJAX?AJAX作用是什么? async javascript and xml(异步的javascript和xml) 作用:实现局部刷新 async:我们真实项目中一般使用AJAX从服务器端获 ...
- (转)bat批处理的注释语句
在批处理中,段注释有一种比较常用的方法: goto start = 可以是多行文本,可以是命令 = 可以包含重定向符号和其他特殊字符 = 只要不包含 :start 这一行,就都是注释 :start 另 ...
- 原生js大总结二
011.if语句的优化 1.把次数多的条件和执行结果放到最前面 2.减少第一次无用的判断,可以用嵌套判断 3.判断语句禁止出现三次嵌套 012.谈谈你对switch的理解 1. ...
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 搭建聊天机器人Bot Framework
Bot Framework 搭建聊天机器人 这周我来跟大家分享的是在Microsoft Build 2016上发布的微软聊天机器人的框架. 现如今,各种人工智能充斥在我们的生活里.最典型的人工智能产品 ...
- 【习题 5-6 UVA-1595】Symmetry
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每一个y坐标的点都找中点. 看看中点是不是都一样就好. [代码] #include <bits/stdc++.h> us ...