题面:https://www.luogu.org/problemnew/show/P4551

大意:给定一棵 n 个点的带权树,结点下标从 1 开始到 N 。寻找树中找两个结点,求最长的异或路径。

因为 a xor a = 0

所以只需要dfs求一遍所有点到根节点的异或和。

然后改为01串放入trie树中。

因为是异或操作,所以当这个节点为0时,要找节点为1的儿子,会让异或更大。

所以贪心求解。

代码如下。

#include<cstdio>
#include<algorithm>
#define rr register
#define sc(x) scanf("%d",&x)
using namespace std;
const int maxn=100001;
int n;
int head[maxn],tot;
struct node{int nxt,to,val;#define to(x) e[x].to#define val(x) e[x].val#define nxt(x) e[x].nxt
}e[maxn<<1];
inline void add(int u,int v,int w){to(++tot)=v,val(tot)=w;nxt(tot)=head[u];head[u]=tot;
}
int xorr[maxn];
//所有点到根节点的异或值
inline void dfs(int now,int ls){for(rr int i=head[now];i;i=nxt(i)){if(to(i)!=ls){xorr[to(i)]=xorr[now]^val(i);dfs(to(i),now);}}
}
int cnt,trie[maxn*31][2];
inline void build(int x,int p){for(rr int i=1<<30;i;i>>=1){bool c=x&i;if(!trie[p][c])trie[p][c]=++cnt;p=trie[p][c];}
}
inline int ask(int x,int p){int ans=0;for(rr int i=1<<30;i;i>>=1){bool c=x&i;if(trie[p][c^1]) ans+=i,p=trie[p][c^1];else p=trie[p][c];}return ans;
}
int main()
{sc(n);for(rr int i=1;i<n;i++){int u,v,w;sc(u),sc(v),sc(w);add(u,v,w);add(v,u,w);}dfs(1,0);int ans=0;for(rr int i=1;i<=n;i++) build(xorr[i],0);for(rr int i=1;i<=n;i++) ans=max(ans,ask(xorr[i],0));printf("%d\n",ans);// system("pause");return 0;
}

转载于:https://www.cnblogs.com/ChrisKKK/p/11143990.html

luogu_4551【题解】最长异或路径 trie树相关推荐

  1. P4551 最长异或路径

    P4551 最长异或路径 题意: 给定一棵 n 个点的带权树,结点下标从 1 开始到 n.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 题解: 我们 ...

  2. luoguP4551最长异或路径

    P4551最长异或路径 链接 luogu 思路 从\(1\)开始\(dfs\)求出\(xor\)路径.然后根据性质\(x\)到\(y\)的\(xor\)路径就是\(xo[x]^xo[y]\) 代码 # ...

  3. 洛谷 P4551 最长异或路径

    题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...

  4. 01tire+洛谷P4551 最长异或路径

    题目: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入格式 第一行一个整数NN,表示点数. 接下来 ...

  5. 最大异或对[Trie树]

    最大异或对 题目大意:一些数中,选异或值最大的两个数,输出最大的异或值.数据范围1e5 暴力做法,O(N2)O(N^2)O(N2) 直接超时 #include<iostream> #inc ...

  6. LeetCode 720. 词典中最长的单词(Trie树)

    1. 题目 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. 若无 ...

  7. 720 词典中最长的单词(Trie树)

    1. 问题描述: 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. ...

  8. YBTOJ洛谷P4551:最长异或路径(trie树)

    洛谷传送门 文章目录 题目描述 解析 代码 题目描述 解析 本题关键就在于一点: 若把每个点的深度dep[i]定义为从根到节点边权的异或和 那么i到j的路径异或和可以表示为: dep[i] ^ dep ...

  9. 【Trie】最长异或路径(ybtoj Trie-3/luogu 4551)

    正题 ybtoj Trie-3 luogu 4551 题目大意 给你一棵树,让你找一条路径,使这条路径的亦或值最大 解题思路 对于每个数存下到根节点的亦或值,然后拿这些数去Trie中跑最大亦或 因为相 ...

  10. Nikitosh 和异或 —— 一道 trie 树的题用可持久化 trie 水 然后翻车了...

    题意简介 题目就是叫你找两个不重合的非空区间,使得这两个区间里的数异或后相加的和最大 (看到异或,没错就决定是你了可持久化trie!) 思路 水一波字典树,莫名觉得这题可持久化能过,于是水了一发挂了, ...

最新文章

  1. 使用Python,OpenCV进行去水印,图像修复
  2. linux 简单dns搭建,搭建一个简易的DNS服务
  3. java 创建多线程_Java创建多线程
  4. MM定价计算方案确定详细图解
  5. html怎样将单元格的字竖式,数学竖式计算的标准格式是怎样的?需要注意哪些问题?...
  6. import win32com.client在python中报错及其解决办法
  7. php中的递归算法,PHP递归算法(四)
  8. c++语言int最大值,c++ 关于如何获取int型的最大值
  9. tomcat启动遇到的一些问题 闪退、报错等
  10. 固定二进制位的整型变量
  11. Linux内核开发者大会 开始报名啦~
  12. python大数据培训班
  13. PHP Captcha实现图片验证码生成及识别(附源码)
  14. win7系统两台计算机共享文件,教你设置win7系统的两台电脑实现文件共享的详细步骤...
  15. 搜索关键字下载QQ音乐
  16. 苹果手机闹钟声音大小怎么调_偷偷安利5款让手机体验到爆的app,乐趣满满
  17. rocketmq初学者入门
  18. 旅行社旅游APP开发维护经验
  19. android定制离线地图,在Android上创建离线地图
  20. 2021/5/12爬虫第十一次课(ajax、selenium、Phantomjs)

热门文章

  1. java中example函数作用,MyBatis逆向工程中的Mapper接口以及Example的实例函数及详解...
  2. matlab gui怎样将结果保存在excel中_声发射简单使用matlab导入参数波形数据并绘图...
  3. 域名微信拦截html代码,微信域名拦截查询网页源码——一个非常实用的微信域名检测工具实现...
  4. c++:warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
  5. 添加mysql.h头文件
  6. 计算机维修报价,求一张电脑维护维修价格表
  7. 迁安职中计算机专业,迁安职业技术教育中心2021年招生简章
  8. php2.3.2,自动加载 - ThinkPHP3.2完全开发手册
  9. C/C++[codeup 1931]打印日期,一年的第n天是几月几号
  10. SwiftUI实战一:从入门到精通