1. 程式人生 > 其它 >1478:The xor-longest Path

1478:The xor-longest Path

求樹上路徑(x-->y) 的最大異或和

 x-->y 分解為 x-->root , root-->y,預處理出這個字首的東西

然後貪心地在字典樹上查詢

#include "bits/stdc++.h"
using namespace std;

 const int N=3e6;
  int a[N],val[N],n,ch[N][2],tot=1;
  int ans;
 vector<pair<int,int> > g[N];
 
 void dfs(int x,int fa){
     int y,z;
     for(int i=0;i<g[x].size();i++){
         y
=g[x][i].first,z=g[x][i].second; if(y!=fa) val[y]=val[x]^z,dfs(y,x); } } int find(int v){ int u=1,ans=0; for(int i=30;i>=0;i--){ int c=(v>>i)&1; if(ch[u][c^1]){ u=ch[u][c^1]; ans|=(1<<i); } else u=ch[u][c]; }
return ans; } void insert(int v){ int i,u=1; for(i=30;i>=0;i--){ int c=(v>>i)&1; if(ch[u][c]==0) ch[u][c]=++tot; u=ch[u][c]; } } main(){ int x,y,z,i; cin.tie(0);cout.tie(0); cin>>n; for(i=1;i<=n;i++) cin>>x>>y>>z, g[x].push_back(make_pair(y,z)), g[y].push_back(make_pair(x,z)); dfs(
1,0); int ans=0; for(i=1;i<=n;i++){ ans=max(ans,find(val[i])); insert(val[i]); } cout<<ans; }