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

时间:2022-08-27 16:02:57

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

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

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

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

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int maxn = 100005 * 32;
const int sigma_size = 2; struct Tire {
int sz;
int g[maxn][sigma_size]; void init();
int idx(char ch);
void insert(int s);
int find(int s);
}T; int N, M, E, first[maxn], jump[maxn], link[maxn], val[maxn], rec[maxn]; inline void add_Edge (int u, int v, int w) {
link[E] = v;
val[E] = w;
jump[E] = first[u];
first[u] = E++;
} void dfs (int u, int pre, int s) {
T.insert(s);
rec[M++] = s;
for (int i = first[u]; i + 1; i = jump[i]) {
int v = link[i];
if (v == pre)
continue;
dfs(v, u, s ^ val[i]);
}
} int main () {
while (scanf("%d", &N) == 1) {
M = E = 0;
T.init();
memset(first, -1, sizeof(first)); int u, v, w;
for (int i = 1; i < N; i++) {
scanf("%d%d%d", &u, &v, &w);
add_Edge(u, v, w);
add_Edge(v, u, w);
}
dfs(0, 0, 0); int ans = 0;
for (int i = 0; i < M; i++)
ans = max(ans, T.find(rec[i]));
printf("%d\n", ans);
}
return 0;
} void Tire::init() {
sz = 1;
memset(g[0], 0, sizeof(g[0]));
} int Tire::find(int s) {
int ret = 0, u = 0;
for (int i = 30; i >= 0; i--) {
int v = ((s>>i)&1) ^ 1; if (g[u][v])
ret |= (1<<i);
else
v = v^1;
u = g[u][v];
}
return ret;
} void Tire::insert(int s) {
int u = 0; for (int i = 30; i >= 0; i--) {
int v = (s>>i)&1; if (g[u][v] == 0) {
memset(g[sz], 0, sizeof(g[sz]));
g[u][v] = sz++;
}
u = g[u][v];
}
}

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

  1. POJ 3764 The xor-longest Path &lpar; 字典树求异或最值 &amp&semi;&amp&semi; 异或自反性质 &amp&semi;&amp&semi; 好题好思想&rpar;

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

  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 - &lbrack;字典树变形&rsqb;

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

  4. HDU 5715 XOR 游戏 二分&plus;字典树

    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 游戏 二分&plus;字典树&plus;dp

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

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

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

随机推荐

  1. iOS - UIStoryboard

    前言 NS_CLASS_AVAILABLE_IOS(5_0) @interface UIStoryboard : NSObject @available(iOS 5.0, *) public clas ...

  2. Regex sumologic

    https://www.sumologic.com/2014/08/18/no-magic-regular-expressions/

  3. poj 2688 Cleaning Robot bfs&plus;dfs

    题目链接 首先bfs, 求出两两之间的距离, 然后dfs就可以. #include <iostream> #include <cstdio> #include <algo ...

  4. sql pivot、unpivot和partition by用法

    原文:sql pivot.unpivot和partition by用法 演示脚本 from sys.sysobjects where name = 'Student' AND type = 'U') ...

  5. 【第六篇】Volley之https相关

    Volley之https信任所有证书实现: public class HttpsTrustManager implements X509TrustManager { private static Tr ...

  6. Eclipse添加tomcat出现 The Apache Tomcat installation at this directory is version 8&period;5&period;6&period; A Tomcat 8&period;0 installation is expected&period;

    打开tomcat安装目录:apache-tomcat-8.5.6\lib 找到catalina.jar 用解压缩工具打开 org/apache/catalina/util/ServerInfo.pro ...

  7. webpack2 前篇

    webpack2 前篇 #webpack 前两天用了一天半时间琢磨了下webpack2,想起去年这时候,面对webpack1那样恶心的文档,前前后后搞了好几次才摸索清楚,那真是吐了. 划重点 其实we ...

  8. 理解 if &lowbar;&lowbar;name&lowbar;&lowbar; &equals;&equals; &&num;39&semi;&lowbar;&lowbar;main&lowbar;&lowbar;&&num;39&semi;

    简单地理解Python中的if __name__ == '__main__' if __name__ == '__main__'的意思是: 当.py文件被直接运行时,if __name__ == '_ ...

  9. LOJ6072苹果树

    虽然结合了很多算法,但是一步一步地推一下还不算太难的一道题. 首先考虑枚举枚举有用的苹果的集合,然后去算生成树个数. 先考虑怎么计算生成树个数. 发现可以使用matrix-tree. 所有有用点可以和 ...

  10. svn安装配置

    1. 安装SVN服务器: 检查是否已安装 # rpm -qa subversion 安装SVN服务器 # yum install httpd httpd-devel subversion mod_da ...