144. 最长异或值路径 ###K ###K //K
题目链接:https://www.acwing.com/problem/content/description/146/
思路:考虑 固定1为根 有节点a,b a到1的路径之间的异或值和b到1之间的异或值相异或的话
得到的结果就是a到b路径的异或值 画图就可以理解 所以题目可以转换成用dfs求出
根1到所有节点的异或值a[i] 然后求这些a[i]中 某两个组合的最大值 就变成01trie的模板题了
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define pi pair<int,int> 5 #define pb push_back 6 #define fi first 7 #define sc second 8 #define ull unsigned long long 9 const int maxn=1e5+10; 10 const int mod=1e9+7; 11 12 13 int tr[maxn*31][2]; 14 vector<pi>E[maxn]; 15 int a[maxn]; 16 17 void dfs(int u,int fa) 18 { 19 a[u]^=a[fa]; 20 for(auto &v:E[u]) 21 { 22 if(v.fi==fa) continue; 23 a[v.fi]=v.sc; 24 dfs(v.fi,u); 25 } 26 } 27 28 int tot; 29 void add(int x) 30 { 31 int p=0; 32 for(int i=30;i>=0;i--) 33 { 34 int u=x>>i&1; 35 if(!tr[p][u]) tr[p][u]=++tot; 36 p=tr[p][u]; 37 } 38 } 39 int query(int x) 40 { 41 int ans=0,p=0; 42 for(int i=30;i>=0;i--) 43 { 44 int u=x>>i&1; 45 if(tr[p][!u]) p=tr[p][!u],ans+=1<<i; 46 else p=tr[p][u]; 47 } 48 return ans; 49 } 50 51 int main() 52 { 53 ios::sync_with_stdio(0); 54 cin.tie(0); 55 int n; 56 cin>>n; 57 for(int i=1;i<n;i++) 58 { 59 int u,v,w; 60 cin>>u>>v>>w; 61 u++; 62 v++; 63 E[u].pb({v,w}); 64 E[v].pb({u,w}); 65 } 66 dfs(1,0); 67 int mx=0; 68 for(int i=1;i<=n;i++) 69 { 70 add(a[i]); 71 mx=max(mx,query(a[i])); 72 } 73 cout<<mx<<'\n'; 74 75 76 }

浙公网安备 33010602011771号