ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[Trie树]C. 【例题3】最长异或路径

2021-06-12 21:02:53  阅读:164  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有