luogu_4551【题解】最长异或路径 trie树
题面: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树相关推荐
- P4551 最长异或路径
P4551 最长异或路径 题意: 给定一棵 n 个点的带权树,结点下标从 1 开始到 n.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 题解: 我们 ...
- luoguP4551最长异或路径
P4551最长异或路径 链接 luogu 思路 从\(1\)开始\(dfs\)求出\(xor\)路径.然后根据性质\(x\)到\(y\)的\(xor\)路径就是\(xo[x]^xo[y]\) 代码 # ...
- 洛谷 P4551 最长异或路径
题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...
- 01tire+洛谷P4551 最长异或路径
题目: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入格式 第一行一个整数NN,表示点数. 接下来 ...
- 最大异或对[Trie树]
最大异或对 题目大意:一些数中,选异或值最大的两个数,输出最大的异或值.数据范围1e5 暴力做法,O(N2)O(N^2)O(N2) 直接超时 #include<iostream> #inc ...
- LeetCode 720. 词典中最长的单词(Trie树)
1. 题目 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. 若无 ...
- 720 词典中最长的单词(Trie树)
1. 问题描述: 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. ...
- YBTOJ洛谷P4551:最长异或路径(trie树)
洛谷传送门 文章目录 题目描述 解析 代码 题目描述 解析 本题关键就在于一点: 若把每个点的深度dep[i]定义为从根到节点边权的异或和 那么i到j的路径异或和可以表示为: dep[i] ^ dep ...
- 【Trie】最长异或路径(ybtoj Trie-3/luogu 4551)
正题 ybtoj Trie-3 luogu 4551 题目大意 给你一棵树,让你找一条路径,使这条路径的亦或值最大 解题思路 对于每个数存下到根节点的亦或值,然后拿这些数去Trie中跑最大亦或 因为相 ...
- Nikitosh 和异或 —— 一道 trie 树的题用可持久化 trie 水 然后翻车了...
题意简介 题目就是叫你找两个不重合的非空区间,使得这两个区间里的数异或后相加的和最大 (看到异或,没错就决定是你了可持久化trie!) 思路 水一波字典树,莫名觉得这题可持久化能过,于是水了一发挂了, ...
最新文章
- 使用Python,OpenCV进行去水印,图像修复
- linux 简单dns搭建,搭建一个简易的DNS服务
- java 创建多线程_Java创建多线程
- MM定价计算方案确定详细图解
- html怎样将单元格的字竖式,数学竖式计算的标准格式是怎样的?需要注意哪些问题?...
- import win32com.client在python中报错及其解决办法
- php中的递归算法,PHP递归算法(四)
- c++语言int最大值,c++ 关于如何获取int型的最大值
- tomcat启动遇到的一些问题 闪退、报错等
- 固定二进制位的整型变量
- Linux内核开发者大会 开始报名啦~
- python大数据培训班
- PHP Captcha实现图片验证码生成及识别(附源码)
- win7系统两台计算机共享文件,教你设置win7系统的两台电脑实现文件共享的详细步骤...
- 搜索关键字下载QQ音乐
- 苹果手机闹钟声音大小怎么调_偷偷安利5款让手机体验到爆的app,乐趣满满
- rocketmq初学者入门
- 旅行社旅游APP开发维护经验
- android定制离线地图,在Android上创建离线地图
- 2021/5/12爬虫第十一次课(ajax、selenium、Phantomjs)
热门文章
- java中example函数作用,MyBatis逆向工程中的Mapper接口以及Example的实例函数及详解...
- matlab gui怎样将结果保存在excel中_声发射简单使用matlab导入参数波形数据并绘图...
- 域名微信拦截html代码,微信域名拦截查询网页源码——一个非常实用的微信域名检测工具实现...
- c++:warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
- 添加mysql.h头文件
- 计算机维修报价,求一张电脑维护维修价格表
- 迁安职中计算机专业,迁安职业技术教育中心2021年招生简章
- php2.3.2,自动加载 - ThinkPHP3.2完全开发手册
- C/C++[codeup 1931]打印日期,一年的第n天是几月几号
- SwiftUI实战一:从入门到精通