题意

给你一棵树,n个节点,n-1条边每条边i都有一个权值wi。定义任意两点间的权值为:这两点间的路径上的所有边的值的异或。比如a点和b点间有i,j,k三条边,那么ab两点间的权值为:wi^wj^wk。求这个最大的权值(最长异或路径)。

(n<=105)

题解

首先  边权可以放到点权上

然后我们可以搞一个树上的前缀异或和.
这样的话 把当前点的所有点权加到trie树里
从最高位到最低位走不同的路
例:1011100101
我们要走:0100011010
如果走不了就顺着走
跑出来的数异或当前的数就是经过这个点的最优解了

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const long long N=201000;
 8 long long ans,tot,cnt,head[N],n,mx,flag;
 9 struct edge{
10     long long to,nxt,w;
11 }e[N*2];
12 struct tree{
13     long long nxt[4];
14 }tr[N*50];
15 void insert(long long a){
16     long long now=0,z;
17     for(long long i=31;i>=1;i--){
18         if(a&(1<<(i-1)))z=1;
19         else z=0;
20         if(!tr[now].nxt[z]){
21             tr[now].nxt[z]=++tot;
22             memset(tr[tot].nxt,0,sizeof(tr[tot].nxt));
23         }
24         now=tr[now].nxt[z];
25     }
26 }
27 void check(long long x){
28     long long tmp=0;
29     long long now=0,z;
30     for(long long i=31;i>=1;i--){
31         if(x&(1<<(i-1)))z=1;
32         else z=0;
33         if(tr[now].nxt[!z]){
34             tmp=(tmp<<1)+1;
35             now=tr[now].nxt[!z];
36         }
37         else{
38             tmp=tmp<<1;
39             now=tr[now].nxt[z];
40         }
41     }
42     ans=max(ans,tmp);
43 }
44 void add(long long u,long long v,long long w){
45     cnt++;
46     e[cnt].nxt=head[u];
47     e[cnt].to=v;
48     e[cnt].w=w;
49     head[u]=cnt;
50 }
51 void dfs1(long long u,long long f,long long w){
52     insert(w);
53     for(long long i=head[u];i;i=e[i].nxt){
54         long long v=e[i].to;
55         if(v==f)continue;
56         w^=e[i].w;
57         dfs1(v,u,w);
58         w^=e[i].w;
59     }
60 }
61 void dfs2(long long u,long long f,long long w){
62     check(w);
63     for(long long i=head[u];i;i=e[i].nxt){
64         long long v=e[i].to;
65         if(v==f)continue;
66         w^=e[i].w;
67         dfs2(v,u,w);
68         w^=e[i].w;
69     }
70 }
71 int main(){
72     while(~scanf("%lld",&n)){
73         ans=0;cnt=0;tot=0;mx=0;flag=0;
74         memset(head,0,sizeof(head));
75         memset(tr[0].nxt,0,sizeof(tr[0].nxt));
76         for(long long i=1;i<=n-1;i++){
77             long long u,v,w;
78             scanf("%lld%lld%lld",&u,&v,&w);
79             u++;v++;
80             add(u,v,w);
81             add(v,u,w);
82         }
83         insert(0);
84         dfs1(1,0,0);
85         dfs2(1,0,0);
86         printf("%lld\n",ans);
87     }
88     return 0;
89 }

转载于:https://www.cnblogs.com/Xu-daxia/p/9559154.html

POJ3764 The xor-longest Path(字典树)相关推荐

  1. HDU4825 Xor Sum 01字典树(Tire Tree)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  2. 【CF1616H】Keep XOR Low(字典树)

    题面 题解 为了方便,我们将 xxx 加 1,然后让 aixoraj<xa_i\mathrm{~xor~}a_j<xai​ xor aj​<x . 可以把数插入到字典树中,然后遍历字 ...

  3. CodeForces - 979D Kuro and GCD and XOR and SUM(字典树+暴力+模拟)

    题目链接:点击查看 题目大意:说实话看到这么复杂而且还是英文的题面我是拒绝的,但题还是得补啊,就去百度找的题解看题意,题意大概是这样的: 给出n个操作,每个操作分为两种类型: 1 x:向集合中插入x ...

  4. POJ - 3764 The xor-longest Path(字典树性质)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个边权,现在问能否选择两个点,使得其间路径上的异或和最大 题目分析:直接求肯定是比较复杂的,我们可以转换一下题意,因为是一棵树,所以n个点肯定互 ...

  5. 提高篇 第二部分 字符串算法 第3章 Trie字典树

    Trie(字典树)解析及其在编程竞赛中的典型应用举例 - Reqaw - 博客园 『一本通』Trie字典树 - YeLingqi - 博客园 字典树(Trie Tree) - 仰望高端玩家的小清新 - ...

  6. 字典树--Xor问题

    字典树大家都知道吧,如果不知道可以看这里,我的模板写得还是不错的: 字符串–Trie树(字典树) 接下来我们先看一个问题,通过这个问题来了解Xor这个运算的基本性质: 洛谷 P2420 让我们异或吧 ...

  7. LeetCode 14. Longest Common Prefix字典树 trie树 学习之 公共前缀字符串

    所有字符串的公共前缀最长字符串 特点:(1)公共所有字符串前缀 (好像跟没说一样...) (2)在字典树中特点:任意从根节点触发遇见第一个分支为止的字符集合即为目标串 参考问题:https://lee ...

  8. nyoj 947 Max Xor(字典树)

    Max Xor 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 给一个长度为 n 的数列 {an} ,找出 max {ai ^ aj}. 输入 多组测试数据. 第 1 行 ...

  9. HDU多校1 - 6955 Xor sum(字典树+贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,要求找到一段长度最短的区间,使得异或和大于等于 kkk,如果有多种答案,输出左端点最小的那个 题目分析:倒着维护一下后缀异或和,将后缀异或 ...

  10. POJ3764-The xor-longest Path【Trie(字典树)】

    正题 POJ题目链接:http://poj.org/problem?id=3764 其实loj也有题目:https://loj.ac/problem/10056 题目大意 一棵树,求两个点使他们的之间 ...

最新文章

  1. java 移动支付接口开发,移动支付平台间接口报文解析技术核心架构实现、及平台交易处理项目全程实录教程...
  2. iOS标准时间与时间戳相互转换
  3. notepad++ 远程连接阿里云服务器
  4. Windows下运行jekyll,编码已不再是问题
  5. H.264视频开发---代码移植
  6. IoT -- (五) IoT都有哪些通信协议
  7. magicmatch java_Java-webmagic爬虫
  8. c++多线程——简单线程池
  9. Unity3D基础42:AnyState大法
  10. 宝藏女孩程序媛,谈谈职场成长这些事
  11. linux教程,linux视频教程,linux…
  12. ubuntu下adb的使用以及开启黑域
  13. Proface触摸屏与三菱PLC软件仿真(或连接实体PLC)
  14. mysql是个单用户数据库_MySQL是一个支持单用户的数据库管理系统 答案:×
  15. t检验和wilcoxon秩和检验 判断两组数据间的显著性差异
  16. 手机微信wifi怎么连接到服务器地址,出门在外用手机流量太贵,教你一招,用微信就能连接附近wifi...
  17. 关于Android短信拦截(二)
  18. Java / Tensorflow - API 调用 pb 模型使用 GPU 推理
  19. 众多促销标签免抠元素素材一键即可获取
  20. 2023-2028年中国黄酒行业市场预测与投资规划分析报告

热门文章

  1. 2018 CodeM初赛B轮:D.神奇盘子
  2. bzoj 3375: [Usaco2004 Mar]Paranoid Cows 发疯的奶牛(二分)
  3. bzoj 2844: albus就是要第一个出场(线性基)
  4. matlab2c使用c++实现matlab函数开发配置全解
  5. Echarts数据可视化echarts实例的相关操作,开发全解+完美注释
  6. matlab2c使用c++实现matlab函数系列教程-deconv函数
  7. 图像处理四:霍夫变换
  8. xilinx sdk用alt+?进行自动补全
  9. java stream collect_java流stream中的collect()方法详解
  10. Linux基础-1使用命令帮助