题目链接:poj 3764 The xor-longest Path

题目大意:给定一棵树,每条边上有一个权值。找出一条路径,使得路径上权值的亦或和最大。

解题思路:dfs一遍,预处理出每一个节点到根节点路径的亦或和rec,那么随意路径均能够表示rec[a] ^ rec[b],所以问题

就转换成在一些数中选出两个数亦或和最大。那么就建立字典树查询就可以。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn = 100005 * 32;
  6. const int sigma_size = 2;
  7. struct Tire {
  8. int sz;
  9. int g[maxn][sigma_size];
  10. void init();
  11. int idx(char ch);
  12. void insert(int s);
  13. int find(int s);
  14. }T;
  15. int N, M, E, first[maxn], jump[maxn], link[maxn], val[maxn], rec[maxn];
  16. inline void add_Edge (int u, int v, int w) {
  17. link[E] = v;
  18. val[E] = w;
  19. jump[E] = first[u];
  20. first[u] = E++;
  21. }
  22. void dfs (int u, int pre, int s) {
  23. T.insert(s);
  24. rec[M++] = s;
  25. for (int i = first[u]; i + 1; i = jump[i]) {
  26. int v = link[i];
  27. if (v == pre)
  28. continue;
  29. dfs(v, u, s ^ val[i]);
  30. }
  31. }
  32. int main () {
  33. while (scanf("%d", &N) == 1) {
  34. M = E = 0;
  35. T.init();
  36. memset(first, -1, sizeof(first));
  37. int u, v, w;
  38. for (int i = 1; i < N; i++) {
  39. scanf("%d%d%d", &u, &v, &w);
  40. add_Edge(u, v, w);
  41. add_Edge(v, u, w);
  42. }
  43. dfs(0, 0, 0);
  44. int ans = 0;
  45. for (int i = 0; i < M; i++)
  46. ans = max(ans, T.find(rec[i]));
  47. printf("%d\n", ans);
  48. }
  49. return 0;
  50. }
  51. void Tire::init() {
  52. sz = 1;
  53. memset(g[0], 0, sizeof(g[0]));
  54. }
  55. int Tire::find(int s) {
  56. int ret = 0, u = 0;
  57. for (int i = 30; i >= 0; i--) {
  58. int v = ((s>>i)&1) ^ 1;
  59. if (g[u][v])
  60. ret |= (1<<i);
  61. else
  62. v = v^1;
  63. u = g[u][v];
  64. }
  65. return ret;
  66. }
  67. void Tire::insert(int s) {
  68. int u = 0;
  69. for (int i = 30; i >= 0; i--) {
  70. int v = (s>>i)&1;
  71. if (g[u][v] == 0) {
  72. memset(g[sz], 0, sizeof(g[sz]));
  73. g[u][v] = sz++;
  74. }
  75. u = g[u][v];
  76. }
  77. }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. POJ 2513 Colored Sticks (欧拉回路 + 字典树 +并查集)

    Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 27097   Accepted: 7175 ...

随机推荐

  1. thinkphp中的where()方法

    where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询.表达式查询.快捷查询.区间查询.组合查询在内的查询操作.where方法 ...

  2. Android 获取系统内置Intent

    1,掉web浏览器 Uri myBlogUri = Uri.parse("http://www.yzmanga.com"); returnIt = new Intent(Inten ...

  3. JIRA项目跟踪管理工具简介与安装

    1.什么是JIRA JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域. Atlassian2002年 ...

  4. linux脚本之简单实例

    利用脚本计算10的阶乘 简单说明一下: #!/bin/bash说明该shell使用的bash shell程序.这一句不可少for i in `seq 1 10`还可以写成for i in 1 2 3 ...

  5. BLOB存储图片文件二进制数据是非对错

    子在一天一天虚度,生活也在一天一天中茫然 做人做事哪能尽如人意,付出多少收获多少虽然存在偏颇,但是不劳而获的心态是万万不对的,更不能去怨天尤人,低调为人.做好自己就可以了 改进你的系统的最好的方法是先 ...

  6. TX enqueue DRM

  7. poj 2186 (强连通缩点)

    题意:有N只奶牛,奶牛有自己认为最受欢迎的奶牛.奶牛们的这种“认为”是单向可传递的,当A认为B最受欢迎(B不一定认为A最受欢迎),且B认为C最受欢迎时,A一定也认为C最受欢迎.现在给出M对这样的“认为 ...

  8. JavaScript阻止事件冒泡

    今天在自学敲代码的时候发现了一个问题,当时的例子如下: <!DOCTYPE html> <html lang="en"> <head> < ...

  9. SpringMVC中采用简洁的配置实现文件上传

    文件上传我们一般会有两种策略,一种是通过IO流上传,还有一种是通过表单上传,其实这两种在客户端实现起来都是很简单的,在服务端处理会略有差别,个人感觉IO上传代码简单,但是也有很多硬伤,还是表单上传更合 ...

  10. protocol(协议)

      可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守了   //定义一个名叫MyProtocol的 ...