TrieThe XOR-longest Path

Posted osea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TrieThe 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 

 

以上是关于TrieThe XOR-longest Path的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3764 The xor-longest Path

POJ 3764 The xor-longest Path

POJ3764 The xor-longest Path

POJ 3764 The xor-longest path

[bzoj 1954]Pku3764 The xor-longest Path

bzoj1594 Pku3764 The xor-longest Path