写这篇博文的主要还是因为自己菜得抠脚…………
弱校联盟的十一专场的第三天是JAG Practice Contest for ACM-ICPC Asia Regional 2016,其中的E题大意是给一颗有根树,问有多少对子树每个深度的节点数都相同。从长春回来之后自己一直不是很在状态,错把题意当成了问有多少对子树完全同构,然后懵逼三个小时,事后去网上查找树同构的资料,回想起这题问的不是树同构,而是每个深度的节点数是否相同,尴尬死了。真的要好好反省一下。
单单思考这道题,看了网上别人的题解,大致思路很简单,就是用一个素数p给每个深度一个权值,根节点的权值为1,其每个子节点的权值为p,其子节点的子节点的权值就为p^2,然后一个树的hash值就是其所有子节点的权值之和。
可以确定的是:如果两棵树各个深度的节点个数都一样,毫无疑问这两棵树的hash值是一样的。而素数只要选择稍稍得当,就很难会出现两棵不相同的树的hash值相同。(其实这里不能主观臆想,应该要有一个严格的证明,但是我数学基础比较弱,而且没有相关的知识储备,暂且把前面这句话当做结论记一下,希望不会有错,自己以后知道了相关原理再回来补充)于是此题就可以通过dfs的方式求各个子树的值,用map标记后就可以求得解了。
题目链接: