P4551 最长异或路径

题目描述

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

异或路径指的是指两个结点之间唯一路径上的所有边权的异或。

输入输出格式

输入格式:

第一行一个整数\(N\),表示点数。

接下来 \(n-1\) 行,给出 \(u,v,w\) ,分别表示树上的 \(u\) 点和 \(v\) 点有连边,边的权值是 \(w\)。

输出格式:

一行,一个整数表示答案。

输入输出样例

输入样例#1: 复制

4

1 2 3

2 3 4

2 4 6

输出样例#1: 复制

7

说明

最长异或序列是1-2-3,答案是 7 (=3 ⊕ 4)

数据范围

\(1\le n \le 100000;0 < u,v \le n;0 \le w < 2^{31}\)

题解

字典树处理异或最大值模板题。

我们把每次数拆成01序列并且建字典树。

然后\(O(n)\)匹配每一个数字在字典树上的异或最大值,取最大的。

如何保证?我们是按从大到小的位数建的字典树,那么能选出1就选1.

每一个数字为建树时,该节点到根节点的异或值。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
const int N=2e5+5;
int n,num,head[N],ch[N],tot;
int vis[N],ans;
struct node{
int to,v,nex;
}e[N<<1];
struct tree{
int ch[2];
}t[N*30];
int read(){
int x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
} void add(int from,int to,int v){
num++;
e[num].to=to;
e[num].v=v;
e[num].nex=head[from];
head[from]=num;
} void dfs(int x){
for(int i=head[x];i;i=e[i].nex){
int v=e[i].to;
ch[v]=ch[x]^e[i].v;
dfs(v);
}
} void build(int x){
for(int i=0;i<=30;i++){
if(x&(1<<i))vis[i]=1;
}
int now=0;
for(int i=30;i>=0;i--){
if(!t[now].ch[vis[i]])
t[now].ch[vis[i]]=++tot;
now=t[now].ch[vis[i]];
vis[i]=0;
}
} void query(int x){
for(int i=0;i<=30;i++)
if(x&(1<<i))vis[i]=1;
int now=0,sum=0;
for(int i=30;i>=0;i--){
if(t[now].ch[vis[i]^1])
now=t[now].ch[vis[i]^1],sum+=(1<<i);
else now=t[now].ch[vis[i]];
vis[i]=0;
}ans=max(ans,sum);
} int main(){
n=read();
for(int i=1;i<n;i++){
int x=read(),y=read(),z=read();
add(x,y,z);//add(y,x,z);
}dfs(1);
for(int i=1;i<=n;i++)build(ch[i]);
for(int i=1;i<=n;i++)query(ch[i]);
cout<<ans<<endl;
return 0;
}

最新文章

  1. lintcode-【中等】恢复IP地址
  2. 【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度
  3. STL--STL和她的小伙伴们:
  4. 高仿百度传课应用客户端源码iOS版
  5. BW知识点总结及面试要点
  6. iOS程序的完整启动过程(有storyboard)
  7. vim的配置文件参数
  8. 非root用户搭建hadoop伪分布式
  9. Ubuntu安装使用latex
  10. 【svn】本地文件夹同步到SVN
  11. 【web安全】-- springboot实现两次MD5加密
  12. 最简单易懂的Spring Security 身份认证流程讲解
  13. vue-实现全选单选
  14. 前端框架之Vue(9)-组件基础&amp;vue-cli
  15. [Unity插件]Lua行为树(十一):组合节点Parallel
  16. VB API判断数组为空
  17. NuGet Package Explorer上传时报:failed to process request:&#39;Method Not Allowed&#39;错误解决办法
  18. Struts2中的拦截器详解
  19. 关于 ie9 不执行 js 的问题
  20. Oracle语句(一)之简单查询

热门文章

  1. qt4.7.0 交叉编译环境搭建经验总结
  2. 可执行程序无法在Linux上运行,显示line 1: syntax error: word unexpected (expecting &quot;) .
  3. nodejs-mysql模块
  4. 不可靠信号SIGCHLD丢失的问题
  5. HDU 2371
  6. 使用UE4公布安卓平台游戏
  7. EJB学习(四)——Enterprise Bean(企业Bean)和Entity Bean(实体Bean)
  8. hdoj 5092 Seam Carving 【树塔DP变形 + 路径输出】 【简单题】
  9. POJ - 3257 Cow Roller Coaster (背包)
  10. TCO 2015 2D