首页 > 其他分享 >哈希

哈希

时间:2024-02-27 23:56:45浏览次数:22  
标签:rt Hash 哈希 int son ull

哈希

树哈希,就是对于树的哈希

#include<bits/stdc++.h>
using namespace std;

#define ull unsigned long long
int m,n;
vector<int> son[60]; 
ull shift(ull x){
	x^=x<<13;
	x^=x>>7;
	x^=x<<17;
	return x; 
}
ull f[60],g[60];
void dfs1(int x){
	f[x]=1;
	for(auto y:son[x]){
		dfs1(y);
		f[x]+=shift(f[y]);
	}
}
void dfs2(int x){
	for(auto y:son[x]){
		g[y]=f[y]+shift(g[x]-shift(f[y]));//notice the double shift 
		dfs2(y);
	}
}
ull a[60];
int ans[60];
struct Hash_Table{
	int M;
	vector<pair<ull,int>> a[2000010];
	Hash_Table(){
		M=1000003;
	}
	int Hash(ull x){
		return x%M;
	}
	void insert(ull val,int id){
		int h=Hash(val);
		for(int i=0;i<a[h].size();++i)
			if(a[h][i].first==val){
				ans[id]=a[h][i].second;
				return;	
			}
		ans[id]=id;
		a[h].emplace_back(val,id);
	}
}H;
int main(){
	cin>>m;
	for(int i=1;i<=m;++i){
		cin>>n;int rt;
		for(int i=1;i<=n;++i)son[i].clear();
		for(int i=1;i<=n;++i){
			int p;cin>>p;
			if(p==0)rt=i;
			else son[p].emplace_back(i);
		}
		dfs1(rt);
		g[rt]=f[rt];
		dfs2(rt);
		ull res=1;
		for(int j=1;j<=n;++j)res+=shift(g[j]);
		H.insert(res,i);
		printf("%d\n",ans[i]);
	}
	return 0; 
}

标签:rt,Hash,哈希,int,son,ull
From: https://www.cnblogs.com/life-of-a-libertine/p/18038790

相关文章

  • 哈希表
    #pragmaonce//#include<unordered_map>//#include<unordered_set>#include<string>#include<iostream>usingstd::cout;usingstd::endl;usingstd::cin;//unordered_set和unordered_map--还有multi共4中/*****和RBT的区别是*1.unordere......
  • CCPC2023深圳 K-四国军棋(线段树维护单调栈哈希值)
    传送门解题思路对于每个人的棋子,总是最高的那个棋子发挥决定性作用,被消耗后,再看剩下的最高的棋子。这就相当于单调不递增栈的维护过程。最后就要比较两个人的单调不递增栈是否完全相同。和经典的楼房重建相似,但是这个题不止需要维护单调栈的长度,还要维护哈希值。我是分开写的......
  • 关于磁盘和镜像的哈希值校验
    在取证做题联系的时候经常遇到这样的题目:请计算源盘的hash值,这时我们需要先对镜像进行挂载,像ftkimager等等软件,再对挂载后的磁盘进行hash值的计算给出两个计算工具1、火眼放入检材后相当于自动挂载2、winhex(注意此时如果需要计算本地磁盘的hash值,需要以管理员的身份运行winhe......
  • 代码随想录 第六天 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交
    LeetCode:242.有效的字母异位词-力扣(LeetCode)思路:既然只判断两个字符串的字母,就一个++,一个--,最后如果二十六个字母都是零,说明两个字符串相等。反思: //charat(i)是返回字符串索引,所以s.charAt(i)-'a'实际上是获取字符串s中第i个字符相对于字母'a'的偏移量。......
  • python dict 哈希表
    哈希值Python 内置函数 hash 返回对象 哈希值 ,哈希表 依赖 哈希值 索引元素:根据哈希表性质, 键对象 必须满足以下两个条件,否则哈希表便不能正常工作:哈希值在对象整个生命周期内不能改变;可比较,且比较相等的对象哈希值必须相同;满足这两个条件的对象便是......
  • 图解一致性哈希算法
    一、背景在具体介绍一致性哈希算法之前,先问一个问题:为什么需要一致性哈希算法?下面我们通过一个案例来回答这个问题。假设有这么一种场景:我们有三台缓存服务器分别为:node0、node1、node2,有3000万个缓存数据需要存储在这三台服务器组成的集群中,希望可以将这些数据均匀的缓存到三台......
  • 算法-哈希表
    1.有效字母的异位词(LeetCode242)题目:给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。s和t仅包含小写字母思路:使用大小为26的数组存储单词中每个字母出现的次数因为题目限制了字......
  • [学习笔记]哈希与哈希表
    1.定义我们定义一个把字符串映射到整数的函数\(f\),这个\(f\)称为是Hash函数。我们希望这个函数\(f\)可以方便地帮我们判断两个字符串是否相等。词汇“映射”映射意为将一个集合中的任意元素和另一个集合中的元素一一对应。(请大佬指正)2.思想Hash的核心思想在于,将输入......
  • Python计算两图相似性-哈希算法(Hash)
    1、简介aHash:平均值哈希。速度比较快,但是常常不太精确。pHash:感知哈希。精确度比较高,但是速度方面较差一些。dHash:差异值哈希。精确度较高,均值哈希算法、差值哈希算法和感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的hash值有多少不同。三直方图和单通道直方图......
  • 4-Redis十大关系之哈希Hash
    Redis十大关系之哈希Hash:Map<String,Map<Object,Object>>HSETkeyfieldvaluefieldvalue...:设置属性值HGETkeyfield:获取对应属性值HGETALLkey:遍历哈希HDELkeyfield:删除field对应的属性HLENkey:获取某个key内的全部数量HEXISTSkeyfield:判断key中有没有fie......