首页 > 代码库 > [BZOJ1954]The xor-longest Path

[BZOJ1954]The xor-longest Path

设c[x]为x到根的xor路径异或和

那么a->b的xor路径异或和为c[a]^c[b]

因为lca(a,b)到根的xor路径异或和被抵消了

所以我们要做的就是dfs一遍求出c[i]然后找到max{c[i]^c[j]}

这个时候我们可以用trie求出答案

 

 

 1 #include<stdio.h>
 2 struct node{
 3     int to,next,v;
 4     node(){to=next=v=0;}
 5 }e[200001];
 6 int tree[3200001][2],h[100001],xorsum[100001],n,i,a,b,c,tot;
 7 void add(int x,int y,int v){
 8     tot++;
 9     e[tot].to=y;
10     e[tot].next=h[x];
11     e[tot].v=v;
12     h[x]=tot;
13 }
14 void dfs(int fa,int x){
15     for(int i=h[x];i;i=e[i].next){
16         if(e[i].to!=fa){
17             xorsum[e[i].to]=xorsum[x]^e[i].v;
18             dfs(x,e[i].to);
19         }
20     }
21 }
22 void insert(int root,int x,int p){
23     if(p<0)return;
24     if(!tree[root][(x&(1<<p))>>p]){
25         tot++;
26         tree[root][(x&(1<<p))>>p]=tot;
27     }
28     insert(tree[root][(x&(1<<p))>>p],x,p-1);
29 }
30 int findxor(int root,int x,int p){
31     if(p<0)return 0;
32     if(tree[root][!(x&(1<<p))])
33         return((!(x&(1<<p)))<<p)|findxor(tree[root][!(x&(1<<p))],x,p-1);
34     else
35         return(x&(1<<p))|findxor(tree[root][x&(1<<p)],x,p-1);
36 }
37 int max(int a,int b){return a>b?a:b;}
38 int main(){
39     scanf("%d",&n);
40     tot=0;
41     for(i=1;i<n;i++){
42         scanf("%d%d%d",&a,&b,&c);
43         add(a,b,c);
44         add(b,a,c);
45     }
46     xorsum[1]=0;
47     dfs(0,1);
48     tot=0;
49     a=0;
50     for(i=1;i<=n;i++)insert(0,xorsum[i],30);
51     for(i=1;i<=n;i++)a=max(a,findxor(0,xorsum[i],30)^xorsum[i]);
52     printf("%d",a);
53 }

 

[BZOJ1954]The xor-longest Path