树的Hash方法?

本文探讨了在ACM-ICPC亚洲区域赛中的一道关于树的问题,该问题询问有多少对子树具有相同的深度节点数。文章介绍了通过使用素数给每个深度分配权重并计算树的Hash值的方法来解决此问题,以及这种方法为何能确保相同深度节点数的树具有相同的Hash值。此外,作者还讨论了如何处理完全同构子树的问题,提供了一种将每个节点的Hash值平方来避免冲突的策略,并给出了相关代码示例。
写这篇博文的主要还是因为自己菜得抠脚…………

弱校联盟的十一专场的第三天是JAG Practice Contest for ACM-ICPC Asia Regional 2016,其中的E题大意是给一颗有根树,问有多少对子树每个深度的节点数都相同。从长春回来之后自己一直不是很在状态,错把题意当成了问有多少对子树完全同构,然后懵逼三个小时,事后去网上查找树同构的资料,回想起这题问的不是树同构,而是每个深度的节点数是否相同,尴尬死了。真的要好好反省一下。

单单思考这道题,看了网上别人的题解,大致思路很简单,就是用一个素数p给每个深度一个权值,根节点的权值为1,其每个子节点的权值为p,其子节点的子节点的权值就为p^2,然后一个树的hash值就是其所有子节点的权值之和。 可以确定的是:如果两棵树各个深度的节点个数都一样,毫无疑问这两棵树的hash值是一样的。而素数只要选择稍稍得当,就很难会出现两棵不相同的树的hash值相同。(其实这里不能主观臆想,应该要有一个严格的证明,但是我数学基础比较弱,而且没有相关的知识储备,暂且把前面这句话当做结论记一下,希望不会有错,自己以后知道了相关原理再回来补充)于是此题就可以通过dfs的方式求各个子树的值,用map标记后就可以求得解了。

相关代码供参考:
为了防止hash值过大,用了unsigned long long进行了取模

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值