题意

给你一棵树,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=;
  8. long long ans,tot,cnt,head[N],n,mx,flag;
  9. struct edge{
  10. long long to,nxt,w;
  11. }e[N*];
  12. struct tree{
  13. long long nxt[];
  14. }tr[N*];
  15. void insert(long long a){
  16. long long now=,z;
  17. for(long long i=;i>=;i--){
  18. if(a&(<<(i-)))z=;
  19. else z=;
  20. if(!tr[now].nxt[z]){
  21. tr[now].nxt[z]=++tot;
  22. memset(tr[tot].nxt,,sizeof(tr[tot].nxt));
  23. }
  24. now=tr[now].nxt[z];
  25. }
  26. }
  27. void check(long long x){
  28. long long tmp=;
  29. long long now=,z;
  30. for(long long i=;i>=;i--){
  31. if(x&(<<(i-)))z=;
  32. else z=;
  33. if(tr[now].nxt[!z]){
  34. tmp=(tmp<<)+;
  35. now=tr[now].nxt[!z];
  36. }
  37. else{
  38. tmp=tmp<<;
  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=;cnt=;tot=;mx=;flag=;
  74. memset(head,,sizeof(head));
  75. memset(tr[].nxt,,sizeof(tr[].nxt));
  76. for(long long i=;i<=n-;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();
  84. dfs1(,,);
  85. dfs2(,,);
  86. printf("%lld\n",ans);
  87. }
  88. return ;
  89. }

POJ3764 The xor-longest Path(字典树)的更多相关文章

  1. poj3764 The XOR Longest Path【dfs】【Trie树】

    The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10038   Accepted:  ...

  2. poj 3764 The xor-longest Path(字典树)

    题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值.找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每一个节点到根 ...

  3. HDU--5269 ZYB loves Xor I (字典树)

    题目电波: HDU--5269 ZYB loves Xor I 首先我们先解决 ai xor aj 每个数转化为二进制  我们用字典树统计 每个节点 0 和 1 的出现的个数 #include< ...

  4. CH 1602 - The XOR Largest Pair - [字典树变形]

    题目链接:传送门 描述在给定的 $N$ 个整数 $A_1, A_2,\cdots,A_N$ 中选出两个进行xor运算,得到的结果最大是多少? 输入格式第一行一个整数 $N$,第二行 $N$ 个整数 $ ...

  5. HDU 5715 XOR 游戏 二分+字典树

    XOR 游戏 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5715 Description 众所周知,度度熊喜欢XOR运算(XOR百科). 今天,它 ...

  6. HDU4825 Xor Sum(字典树解决最大异或问题)

    Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整 ...

  7. HDU-4825 Xor Sum,字典树好题!

    Xor Sum 一遍A了之后大呼一声好(keng)题!debug了两小时~~~~百度之星资格赛,可以. 题意:给你一个n个元素的数组,m次查询,每次输入一个数k要求从数组中找到一个数与k异或值最大,输 ...

  8. 题解 bzoj1954【Pku3764 The xor – longest Path】

    做该题之前,至少要先会做这道题. 记 \(d[u]\) 表示 \(1\) 到 \(u\) 简单路径的异或和,该数组可以通过一次遍历求得. \(~\) 考虑 \(u\) 到 \(v\) 简单路径的异或和 ...

  9. HDU5715 XOR 游戏 二分+字典树+dp

    当时Astar复赛的时候只做出1题,赛后补题(很长时间后才补,懒真是要命),发现这是第二简单的 分析: 这个题,可以每次二分区间的最小异或和 进行check的时候用dp进行判断,dp[i][j]代表前 ...

  10. POJ 3764 The xor-longest Path ( 字典树求异或最值 && 异或自反性质 && 好题好思想)

    题意 : 给出一颗无向边构成的树,每一条边都有一个边权,叫你选出一条路,使得此路所有的边的异或值最大. 分析 : 暴力是不可能暴力的,这辈子不可能暴力,那么来冷静分析一下如何去做.假设现在答案的异或值 ...

随机推荐

  1. Pyhton二级操作题练习

    # 1.编写一个python程序,输入两个数,比较它们的大小并输出其中较大者. num1 = input('请输入数字X:') num2 = input('请输入数字Y:') if num1.isde ...

  2. [NOIP补坑计划]NOIP2017 题解&做题心得

    终于做完了…… 场上预计得分:?(省一分数线:295) 由于看过部分题解所以没有预计得分qwq 题解: D1T1 小凯的疑惑 题面 震惊!一道小学奥数题竟难倒无数高中考生! 欢迎大家以各种姿势*和谐* ...

  3. 2019-03-20 用SSIS把Excel中的数据导出来保存到SQLServer中

    Control Flow 1.配置 好 图形 2.去变量那 配置好 文件路径 和 存储过程 3.在SQL Server创建对应的存储过程,该存储过程的功能是每次导入是清空原有的数据 4.如果不懂的参考 ...

  4. Vue父子组件之间的通讯(学习笔记)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 异构关系数据库(MySql与Oracle)之间的数据类型转换参考

    一.MySQL到Oracle的数据类型的转变: 编号 MySQL ToOracle Oracle 1 GEOMETRY BLOB BLOB 2 GEOMETRYCOLLECTION BLOB BLOB ...

  6. 【【henuacm2016级暑期训练】动态规划专题 H】Greenhouse Effect

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 原题意等价于:给你一个序列(实数的位置没用!)..你可以改变其中某些元素的位置(插入到某些位置中间. 然后让他变成有序的. (有序的 ...

  7. table的创建

    results为table的行信息 columnNames  是table列名 //创建并初始化table: table =new JTable(results,columNames); //设置ta ...

  8. POJ——T1789 Truck History

    http://poj.org/problem?id=1789 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27597   ...

  9. Linux下永久改动MAC地址和ifconfig命令总结

    1. 固定一个MAC地址,特别是在使用多个虚拟机的时候 linux环境下: 用root身份登录,在/etc/rc.d/rc.local里加上这三句 ifconfig eth0 down ifconfi ...

  10. 对象不支持“abigimage”属性或方法

    在一个网页中用了一个js插件, js文件引用的没有错,代码也和demo差点儿相同,  可是执行时ie的调试工具报了一个错: 解决方式: jquery文件冲突,发现原来自己引过一个 <script ...