首页 > 其他分享 >P4551 最长异或路径(树上前缀异或01-trie)

P4551 最长异或路径(树上前缀异或01-trie)

时间:2024-09-14 11:02:51浏览次数:10  
标签:typedef 01 trie ne int 异或 vector vx

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
vector<int> vx;
inline int mp(int x) {return upper_bound(vx.begin(),vx.end(),x)-vx.begin();}
inline int log_2(int x) {return 31-__builtin_clz(x);}
inline int popcount(int x) {return __builtin_popcount(x);}
inline int lowbit(int x) {return x&-x;}
const int N = 1e5+10, M = 3e6+10;
vector<PII> e[N];
int idx;
//D[i]存的是i到根节点的边权异或和,两点的路径异或等于D的异或
int D[N],ne[M][2];
void add(int u,int v,int w)
{
	e[u].push_back({v,w});
}
void dfs(int u,int f)
{
	for(auto [v,w]:e[u])
	{
		if(v==f) continue;
		D[v] = (w^D[u]);
		dfs(v,u);
	}
}
//注意01trie的i的范围是受a[i]值域的影响而非个数
void insert(int t)
{
	int p = 0;
	for(int i=30;i>=0;--i)
	{
		int x = t>>i&1;
		if(!ne[p][x]) ne[p][x] = ++idx, p = idx;
		else p = ne[p][x];
	}
}
int query(int t)
{
	int p = 0;
	int res = 0;
	for(int i=30;i>=0;--i)
	{
		int x = t>>i&1;
		if(ne[p][x^1]) res += 1<<i, p = ne[p][x^1];
		else p = ne[p][x];
	}
	return res;
}
void solve()
{
	int n;
	cin>>n;
	for(int i=1;i<n;++i)
	{
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	dfs(1,0);
	int maxn = 0;
	insert(0);
	//注意i点到根节点的路径也是一组可能的合法解
	for(int i=2;i<=n;++i)
	{
		//cout<<D[i]<<'\n';
		maxn = max(maxn,query(D[i]));
		insert(D[i]);
	}
	cout<<maxn<<'\n';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	//cin>>T;
	while(T--)
	{
		solve();
	}
}

标签:typedef,01,trie,ne,int,异或,vector,vx
From: https://www.cnblogs.com/ruoye123456/p/18413556

相关文章

  • P10471 最大异或对 The XOR Largest Pair(01trie)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......
  • JOI Open 2017(口胡)
    T1AmusementPark题意:通信题。给定一张\(n\)个点\(m\)条边的无向连通图。Alice会得到一个\([0,2^{60})\)中的数\(x\),并且她需要给这张图上每一个结点标一个数字\(a_i=0/1\)。然后Bob也会拿到这张图(编号和Alice的一样),但是他不知道\(x\),也不知道所有点上的数字......
  • P10470 前缀统计(trie树)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......
  • 【新品上市】正点原子ZYNQ7015开发板发布!ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2,性能
    【新品发布】正点原子ZYNQ7015开发板发布!ZYNQ7000系列、双核ARM、PCIe2.0、SFPX2,性能强悍,资料丰富!正点原子Z15ZYNQ开发板,搭载XilinxZynq7000系列芯片,核心板主控芯片的型号是XC7Z015CLG485-2。开发板由核心板+底板组成,外设资源丰富,板载1路PS端千兆以太网接口、PCle2.0x2、SFP光......
  • 【Python爬虫系列】_016.关于登录和验证码
    我的个人主页:......
  • Java入门:08.Java中的static关键字01
    1static关键字可以修饰属性变量,方法和代码段static修饰的属性称为静态属性或类属性,在类加载时就在方法区为属性开辟存储空间,无论创建多少个对象,静态属性在内存中只有一份。可以使用类名.静态属性的方式引用static修饰的方法称为静态方法或类方法,在类加载时就在方法......
  • Luogu P10179 水影若深蓝 题解 [ 绿 ] [ 并查集 ] [ 构造 ]
    水影若深蓝:挺好的一道并查集构造题。观察不难发现“距离为\(2\)”这个条件我们可以通过黑白染色实现,我们把他们的中转点染成与他们相反的颜色,把这两个距离为\(2\)的点染成相同颜色。这个染色问题就很并查集。于是我们用并查集维护相同的种类。显然,当图上只有一个连通块的......
  • P5985 [PA2019] Muzyka pop 题解
    P5985[PA2019]Muzykapop题解是蛮有意思的一道题。\(n\le200\),第一感觉是区间dp,但是又不好设出状态。考虑\(b\)单调递增的过程中的性质,考虑后得到\(b\)的最高含\(1\)的位一定是单调不降的,于是我们考虑将最高的含\(1\)的位设入状态。第一反应是设\(f_{i,j}\)表示......
  • JOI Open 2016
    T1JOIRIS你在玩俄罗斯方块,游戏区域是一个宽度为\(n\),高度足够大的矩形网格、初始时第\(i\)列有\(a_i\)个方块。给定参数\(k\),你可以做不超过\(10^4\)次操作,来将这个网格中的所有方块全部消除,一次操作形如:在网格的最顶端落下一个\(1\timesk\)或者\(k\times1\)......
  • JavaSE--零基础的开始笔记01:下载JDK以及Path环境变量的 配置
    Java概述(觉得没必要的可以直接跳过):Java是sun公司1995年推出,2009年被oracle收购又称为“甲骨文公司”。java之父:詹姆斯.高斯林java是一门高级语言,接近人类语言程序易懂。流行度很高,商业占用率高,特性是:可移植性---可跨平台         JavaSE:标准版,java技......