标签:now Trie son int 异或 tag trie go 例题
解析
这道题我觉得恶心的地方就是要求一整条边的边权的异或给搞出来, 注意运算符不要用错了。
Code
#include <bits/stdc++.h>
#define N 100005
using namespace std;
struct node
{
int x, to, nxt;
}hd[N * 2];
struct Trie
{
int son [2];
}trie[1000001];
int tr[N];
int n, x, y, z, go, tag, tagg, ans;
void add (int x, int y, int z)
{
hd[++ tag] = {z, y, tr[x]};
tr[x] = tag;
hd[++ tag] = {z, x, tr[y]};
tr[y] = tag;
}
void build (int num)
{
int now = 0;
for (int i = 31; i >= 0; -- i)
{
go = num >> i & 1;
if (!trie[now].son[go]) trie[now].son[go] = ++ tagg;
now = trie[now].son[go];
}
}
int find (int num)
{
int now = 0, re = 0;
for (int i = 31; i >= 0; -- i)
{
go = num >> i & 1;
if (trie[now].son[go ^ 1])
{
now = trie[now].son[go ^ 1];
re |= 1 << i;
}
else if (trie[now].son[go]) now = trie[now].son[go];
else return re;
}
return re;
}
void dfs1 (int now, int father, int num)
{
build (num);
for (int i = tr[now]; i; i = hd[i].nxt)
{
if (hd[i].to != father)
dfs1 (hd[i].to, now, num ^ hd[i].x);
}
}
void dfs2 (int now, int father, int num)
{
ans = max (ans, find (num));
for (int i = tr[now]; i; i = hd[i].nxt)
{
if (hd[i].to != father)
dfs2(hd[i].to, now, num ^ hd[i].x);
}
}
int main ()
{
scanf ("%d", &n);
for (int i = 1; i < n; ++ i)
{
scanf ("%d%d%d", &x, &y, &z);
add (x, y, z);
}
dfs1 (1, 0, 0);
dfs2 (1, 0, 0);
printf ("%d", ans);
return 0;
}```
标签:now,Trie,son,int,异或,tag,trie,go,例题 来源: https://www.cnblogs.com/unknown-future/p/14878972.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。