【Trie】The XOR-longest Path

【题目链接】:

https://loj.ac/problem/10056

【题意】

请输出树上两个点的异或路径  的最大值。

【题解】

这个题目,y总说过怎么做之后,简直就是醍醐灌顶了。

我们知道Xor路径,我们从根结点处理所有结点的  到根结点的异或和,我们想要两个点的异或路径。

其实就是利用根结点  到两个点  异或和 。因为LCA到根结点异或了两遍,所以答案就保留了异或路径的部分。

其实这个题目就是Xor——pair的变种。

处理从根结点出发的所有结点的位置的异或值。

【代码】

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N = 1e5 + 100 ;
 6 int Son[N*31][2];
 7 typedef struct Edge{
 8     int To , next , w ;
 9 }Edge ;
10 Edge e[N<<1];
11 int Head[N],cnt,Dis[N],idx;
12 void Init(){
13     memset( Head , -1 ,sizeof Head );
14     cnt = idx = 0 ;
15 }
16 void Add_edge ( int u, int v ,int w ){
17     e[cnt] = Edge { v , Head[u] , w };
18     Head[u] = cnt ++ ;
19 }
20
21 void dfs(int u,int Fa,int w ){
22     Dis[u] = w ;
23     for(int i = Head[u] ; ~i ; i = e[i].next){
24         int To = e[i].To;
25         if( To == Fa ) continue ;
26         dfs( To , u , w ^ e[i].w );
27     }
28 }
29
30 void Insert ( int x ){
31     int p = 0 ;
32     for (int i=30;~i;i--){
33         int t = x >> i & 1 ;
34         if( !Son[p][t] )
35             Son[p][t] = ++idx ;
36         p = Son[p][t] ;
37     }
38 }
39 int Query(int x ){
40     int p = 0 ,res = 0;
41     for(int i=30;~i;i--){
42         int t = x >> i & 1 ;
43         if( Son[p][t^1] ){
44             res += 1 << i ;
45             p = Son[p][t^1];
46         }else{
47             p = Son[p][t] ;
48         }
49     }
50     return res ;
51 }
52 int main()
53 {
54     Init();
55     int n ;
56     scanf("%d",&n);
57     for(int i=1,u,v,w;i<n;i++){
58         scanf("%d%d%d",&u,&v,&w);
59         Add_edge( u , v , w );
60         Add_edge( v , u , w );
61     }
62     dfs( 1 , -1 , 0 ) ;
63     /*
64     for(int i=1;i<=n;i++){
65         printf("###%d###\n",Dis[i]);
66     }
67     */
68     for(int i=1;i<=n;i++){
69         Insert( Dis[i] );
70     }
71     int res = 0;
72     for(int i=1;i<=n;i++){
73         res = max( res , Query(Dis[i] ) );
74     }
75     printf("%d\n",res) ;
76     return 0 ;
77 }

原文地址:https://www.cnblogs.com/Osea/p/11366907.html

时间: 2024-10-02 19:20:56

【Trie】The XOR-longest Path的相关文章

【Trie】The XOR Largest Pair

[题目链接] https://loj.ac/problem/10050 [题意] 给出n个数,其中取出两个数来,让其异或值最大. [题解] 经典的01字典树问题. 首先需要把01字典树建出来. 然后对于每一个串都跑一遍.如果存在当前位 不同的 节点,就往那里跑,否则顺着跑. 一切尽在代码中. [代码] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 1e5+10;

【Math】GCD XOR 证明

题目:Given an integer N, and how many pairs (A;B) are there such that: gcd(A;B) = A xor B where 1<=B<=A<=N. 首先先爆一发,妥妥超时.其实真相是我想打表找规律.结果没什么规律可循. 后来分析:要想让GCD(A,B)==(A^B),A和B一定是同样的位数(二进制).因此打表方法可变为:(亦超时) void init() { int K=0; int last=0; for(int i=1;

【BZOJ2337】[HNOI2011]XOR和路径 期望DP+高斯消元

[BZOJ2337][HNOI2011]XOR和路径 Description 题解:异或的期望不好搞?我们考虑按位拆分一下. 我们设f[i]表示到达i后,还要走过的路径在当前位上的异或值得期望是多少(妈呀好啰嗦),设d[i]表示i的度数.然后对于某条边(a,b),如果它的权值是1,那么f[b]+=(1-f[a])/d[a]:如果它的权值是0,那么f[b]+=f[a]/d[a],然后我们移个项,就变成了一堆方程组求解,直接高斯消元. 别忘了f[n]=0! #include <cstdio> #i

【BZOJ4269】再见Xor 高斯消元

[BZOJ4269]再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. Output 一行,包含两个数,最大值和次大值. Sample Input 3 3 5 6 Sample Output 6 5 HINT 100% : N <= 100000, 保证N个数不全是0,而且在int范围内 题解:大水~ 在线性基上贪心得到最大值,用最大值

【HackerRank】Maximizing XOR

给定两个整数:L 和 R ∀ L ≤ A ≤ B ≤ R, 找出 A xor B 的最大值. 输入格式 第一行包含 L 第一行包含 R 数据范围 1 ≤ L ≤ R ≤ 103 输出格式 输出最大的异或和 题解: 1 import java.io.*; 2 import java.util.*; 3 import java.text.*; 4 import java.math.*; 5 import java.util.regex.*; 6 7 public class Solution { 8

【UVA】12716-GCD XOR

做出做道题需要注意2个地方: 首先可以打表找规律,找到规律我们可以发现: 1.如果gcd(a,b) = a ^ b = c,那么 b = a - c; 既然这样我们可以枚举a,c,求出b之后判断 c 是否等于 a ^ b,那么如何枚举c呢? 2.利用类似筛选素数的方法去枚举a,c 首先c是a的约数,所以这道题我们需要枚举的其实是a的约数,但是约数也不好枚举,我们可以通过c去枚举a,我们通过枚举c,找到约数是c的所有a. 这题由于数据过大,需要打表,否则超时. 14024658 12716 GCD

【Trie】【cogs647】有道搜索框

647. [Youdao2010] 有道搜索框 ★☆ 输入文件:youdao.in 输出文件:youdao.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在有道搜索框中,当输入一个或者多个字符时,搜索框会出现一定数量的提示,如下图所示: 现在给你 N 个单词和一些查询,请输出提示结果,为了简这个问题,只需要输出以查询词为前缀的并且按字典序排列的最前面的 8 个单词,如果符合要求的单词一个也没有请只输出当前查询词. [输入文件] 第一行是一个正整数 N ,表示词表中有

【LeetCode】Binary Tree Maximum Path Sum 解题报告

[题目] Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example: Given the below binary tree, 1 / 2 3 Return 6. [解析] 题意:在二叉树中找一条路径,使得该路径的和最大.该路径可以从二叉树任何结点开始,也可以到任何结点结束. 思路:递归求一条经过root的最大路径,这条路径可能是:

【Trie】背单词

参考博客: https://www.luogu.org/problemnew/solution/P3294 https://blog.csdn.net/VictoryCzt/article/details/87186287 [题意] 题意如果看不懂,请到第二个链接去推一推事例,你就明白这个过程了. 来自题解中glf大佬的解析. 这题目描述真是令人窒息. 3个条件的意思大概是这样: (1).如果有单词作为现在正在填入的单词的后缀但并未填入,将花费n*n的代价. (2).如果没有单词作为当前填入单词