首页 > 其他分享 >P4551 最长异或路径 : 01tire + 树 + 异或

P4551 最长异或路径 : 01tire + 树 + 异或

时间:2023-01-06 10:48:08浏览次数:67  
标签:01tire childs val Tire01Node int nullptr P4551 异或 ret

P4551 最长异或路径 https://www.luogu.com.cn/problem/P4551

知识背景

01tire树,可以用来查找异或的最大值。
经典问题如下。在nums中,哪两个数中异或值最大。
解决方法:将nums 中的每个数,都塞进01tire树中。然后再每一个数从01tire树中找到最大的xor值
思路如图所示

01tire树模板如下

constexpr int DIGLEN = 31;
class Tire01Node {
public:
	Tire01Node* childs[2];
	int cnt;
	Tire01Node() {
		childs[0] = nullptr;
		childs[1] = nullptr;
		cnt = 0;
	}
	void insert(int num) {
		Tire01Node* p = this;
		for (int i = DIGLEN; i >= 0; i--) {
			int x = (num >> i) & 1;
			if(p->childs[x] == nullptr){
				p->childs[x] = new Tire01Node();
			}
			p = p->childs[x];
			p->cnt++;
		}
	}
	int findXorMax(int val) {
		Tire01Node* p = this;
		int ret = 0;
		for (int i = DIGLEN; i >= 0; i--) {
			int x = 1 ^ ((val >> i) & 1);
			if (p->childs[x] != nullptr && p->childs[x]->cnt > 0) {
				p = p->childs[x];
				ret |= (1 << i); 
			} else  p = p->childs[1^x];
			
		}
		return ret;
	}
};

code

此题ac代码如下

#define endl "\n"

constexpr int INF = 0x3f3f3f3f;
constexpr int NMAX = 100005;
using ll = long long;
using ull = unsigned long long;

using namespace std;

namespace Buffalo {
    constexpr int DIGLEN = 31;
	class Tire01Node {
	public:
	    Tire01Node* childs[2];
	    int cnt;
	    Tire01Node() {
	        childs[0] = nullptr;
	        childs[1] = nullptr;
	        cnt = 0;
	    }
	    void insert(int num) {
	        Tire01Node* p = this;
	        for (int i = DIGLEN; i >= 0; i--) {
	            int x = (num >> i) & 1;
	            if(p->childs[x] == nullptr){
	                p->childs[x] = new Tire01Node();
	            }
	            p = p->childs[x];
	            p->cnt++;
	        }
	    }
	    int findXorMax(int val) {
	        Tire01Node* p = this;
	        int ret = 0;
	        for (int i = DIGLEN; i >= 0; i--) {
	            int x = 1 ^ ((val >> i) & 1);
	            if (p->childs[x] != nullptr && p->childs[x]->cnt > 0) {
	                p = p->childs[x];
	                ret |= (1 << i); 
	            } else  p = p->childs[1^x];
	            
	        }
	        return ret;
	    }
	};
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int N;
	cin >> N;
	vector<vector<pair<int, int>>> childs(N + 1);
	int u, v, w;
	vector<bool> isLeaf(N + 1);
	for (int i = 1; i < N; ++i) {
		cin >> u >> v >> w;
		isLeaf[v] = true;
		childs[u].emplace_back(v, w);
	}
	int root=1;
	for (; root <= N && isLeaf[root]; ++root);
	Buffalo::Tire01Node tire;
	vector<int> xorArr;
	function<void(int,int)> dfs = [&](int u,int val) {
		tire.insert(val);
		xorArr.emplace_back(val);
		for (auto& pairs : childs[u]) {
			dfs(pairs.first, pairs.second ^ val);
		}
	};
	dfs(root, 0);

	int ret = INT_MIN;
	for (auto& val : xorArr) {
		ret = max(ret, tire.findXorMax(val));
	}
	cout << ret << endl;
	return 0;
}

标签:01tire,childs,val,Tire01Node,int,nullptr,P4551,异或,ret
From: https://www.cnblogs.com/kingbuffalo/p/16657664.html

相关文章

  • 关于异或-异或运算及其应用
    概念异或,是一个数学运算符,英文为exclusiveOR,缩写为xor,应用于逻辑运算异或的数学符号为“⊕”,计算机符号为“xor”  如果a、b两个值不相同,则异或结果为1......
  • 子数组的最大异或和问题
    子数组的最大异或和问题作者:Grey原文地址:博客园:子数组的最大异或和问题CSDN:子数组的最大异或和问题题目描述数组中所有数都异或起来的结果,叫做异或和。给定一个数组......
  • 关于异或和一些运算符
    上课的时候经常摸鱼,连异或都没搞懂,今天看map源码的时候才注意到有一个看不懂的计算符staticfinalinthash(Objectkey){inth;return(key==nul......
  • 异或运算及其应用-查找奇数个数的数字
     异或运算功能很强大。用的得当可以提高算法效率。先说一下异或运算的运算法则:      1. a^b=b^a2.a^b^c=a^(b^c)=(a^b)^c  3.......
  • C#实现简单的异或加密,方便处理
    将本地的mp4和ts文件加密为“dj”文件,无法播放。解密则是将“dj”文件解密为mp4或ts文件。usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSy......
  • 数组里暴力查找单身狗和'^'异或快速查找单身狗
    intmain(){ chararr[]={1,2,3,4,5,7,5,1,2,3,4}; intsz=sizeof(arr)/sizeof(arr[0]); inti,ret=0; //0^a=a,a^b^a=b,a^a=0,异或满足交换规律,相同为0,反之为1; ......
  • BZOJ4536 : 最大异或和II
    建立$n+m$个点的无向图,其中$n$个点表示输入的数列,$m$个点表示答案的$m$个二进制位。对于输入的两个数$a[i],a[j]$,若它们存在公共二进制位,则可以通过同时选某一公共位来对......
  • 一种关于子集异或和的冷门反演
    前言本文用集合的符号表示二进制数。具体地,定义全集\(u\)是\(2^n-1\),某个二进制数\(x\)第\(t\)位是1可以理解为为\(x\)中有\(t\)号元素,否则没有。定义\(|x|......
  • 位运算异或^的奇技淫巧
    ^异或的性质1、交换律  a^b==b^a2、结合律 (a^b)^c==a^(b^c)3、对于任何数x,都有x^x=0,x^0=x,同自己求异或为0,同0异或为自己4、A^A^B=B,连续和同一个因子做异或运算,最终......
  • OJ周赛三场——异或和
    异或和 问题描述给定多个测试数据。给定一对l,r。请你求出l,l+1....r的异或和(异或的运算为两个数在二进制意义下,对于每一位,若相等则为0,否则为1,例如3xor4,即......