【哈希】判断有根树同构

这是一个未被验证过正确性的判断有根树同构的哈希函数。可以记忆化搜索或者dfs求得。

f(u)表示以u为根的子树的哈希值。

size(u)表示以u为根的子树的大小。

son(u)表示u的儿子数量。

chi表示u的第i个儿子。

p为种子。

O(n)。

typedef unsigned long long ull;
#define N 100001
const ull seed=127;
ull f[N],seeds[N];
void dfs(int U)
{
	size[U]=1;
	int t=0;
	for(int i=first[U];i;i=next[i])
	  {
	  	dfs(v[i]);
	  	f[U]+=f[v[i]]*seeds[size[U]-1];
	  	size[U]+=size[v[i]];
	  }
	f[U]+=seeds[size[U]-1]*(son[U]+1);
}
时间: 2024-10-13 00:56:48

【哈希】判断有根树同构的相关文章

POJ 1635 Subway tree systems Hash法判断有根树是否同构

Hash在信息学竞赛中的一类应用 中的某道例题 "不难想到的算法是使用两个字符串分别表示两棵树,但是如果使用Hash的话应该怎么做呢? 可以使用一种类似树状递推的方法来计算Hash值:  对于一个节点v,先求出它所有儿子节点的Hash值,并从小到大排序,记作H1,H2,„,HD.那么v的Hash值就可以计算为:   (((a * p) ^ H1 mod q) * p ^ H2 mod q).....  换句话说,就是从某个常数开始,每次乘以p,和一个元素异或,再除以q取余,再乘以p,和下一个元素

sicily 1151 简单魔方B BFS和哈希判断重复解题

1151. 魔板 Constraints Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge Description 题目和A题相同,在这里我们把数据范围扩大:N可能超过10. 请仔细考虑各种情况. Input 输入包括多个要求解的魔板,每个魔板用三行描述. 第一行步数N,表示最多容许的步数. 第二.第三行表示目标状态,按照魔板的形状,颜色用1到8的表示. 当N等于-1的时候,表示输入结束. Output 对于每一个要求解的魔板,输出一

[DynamicProgramming]动态规划题目泛做

Educational Codeforces Round 12 F 大意: 求n(n<=1011)以内恰好有4个因数的数的个数 分析: 首先一个数恰好有4个因数,说明它质因数分解之后是两个质数的乘积或是一个质数的三次方,对于后一种情况我们直接n1/3就能算出来,关键在于计算n以内有多少个数是两个素数的乘积. 设n=p1?p2,则必然有p1<n?√,p2>n?√,我们枚举p1,那么问题就在于np1 内有多少个素数. 这一点我们用dp来解决. 记pj为第j个素数,dp[n][j]为[1,n]

[BJOI2015]树的同构 &amp;&amp; 树哈希教程

题目链接 有根树的哈希 离散数学中对树哈希的描述在这里.大家可以看看. 判断有根树是否同构,可以考虑将有根树编码.而编码过程中,要求保留树形态的特征,同时忽略子树顺序的不同.先来看一看这个方法: 不妨令一棵树的编码是个字符串\(T\). 对于一个点\(u\),先求出\(u\)所有\(son_u\)的编码\(f_{son_u}\),然后将这些编码按字典序从小到大排序得到\(g_{1\cdots k}\).那么\(f_u="0"+\sum\limits g_i+"1"\

uva12489 Combating cancer(树同构)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3933 给你两棵无根树,让你判断这两棵树是否同构 不会判断树同构,果断抄了个模板,乱搞给过掉了. 首先由于给的是无根树,而要判断无根树是否同构得以重心为根,然后做一个括号序列

csu 2014 summer trainning day 1 哈希

POJ 1200 题意:给定串s,串中不同字符数nc,所求子串长度n,求长度为n的不同的子串的个数 分析:处理长度很短的字符串哈希,数据保证可以无冲突存储下来,利用hash思想快速查询以前便利的结果,关键在于优化搜索. code: 1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 #include <set> 5 using namespace std; 6 7 int c[

POJ 3349 Snowflake Snow Snowflakes(哈希表)(转)

题意:判断有没有两朵相同的雪花.每朵雪花有六瓣,比较花瓣长度的方法看是否是一样的,如果对应的arms有相同的长度说明是一样的.给出n朵,只要有两朵是一样的就输出有Twin snowflakes found.,如果任何两个都是不一样的输出No two snowflakes are alike.n=100,000. 思路:最 简单的就是枚举每两片雪花,判断他们是否相同.时间复杂度为O(n*n),显然效果不理想.有没有更好的算法呢?hash:每读进一片雪花,将雪花 hash,判断hash表里是否有相同

Cutting (暴力 + 滚动哈希判字符串匹配)

题意: 给你两串小写字符串a和b,问能否将a拆成三段重新组成b 做法: 枚举拆分位置,也就是C(2,4999).然后judge时用滚动哈希判断字符串是否匹配. PS: WA了好多发,因为爆int(忘记1LL,取模没取好...).滚动哈希不一定能A,但基本都能A. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 4

数据结构基础(18) --哈希表的设计与实现

哈希表 根据设定的哈希函数 H(key)和所选中的处理冲突的方法,将一组关键字映射到一个有限的.地址连续的地址集 (区间) 上,并以关键字在地址集中的"映像"作为相应记录在表中的存储位置,如此构造所得的查找表称之为"哈希表". 构造哈希函数的方法 1. 直接定址法(数组) 哈希函数为关键字的线性函数H(key) = key 或者 H(key) = a*key + b 此法仅适合于:地址集合的大小 == 关键字集合的大小 2. 数字分析法 假设关键字集合中的每个关键字