【树同构问题】Educational Codeforces Round 127 (Rated for Div. 2 )E. Preorder
题意:给定一棵完全二叉树,每个结点的值是字符 'A','B' 中的其中一个,可以任意指定遍历顺序,问最终多少个不同前序遍历。
关于该题的做法,还是很明了,dp[i] = dp[l]*dp[r]*[l子树与r子树本质不同?2:1]。
法一:由于这是一棵完美二叉树,每次判断时遍历两个儿子的所有子树来判断,那么总的时间复杂度=n+(n/2)+(n/2)+(n/4)+(n/4)+.....== nlogn。可行。
或者考虑树哈希算法,根据网上学到的算法,关于有根带权树的树哈希算法
f[x] = f[ls[x]]*f[rs[x]] + p^[dep[x]],(0/1)表示一个结点的哈希值是左右哈希之积*(当值为0时,是指数p0的dep次方,当值为1时,是指数p1的dep次方)。
这很类通传统的无权值树同构算法。即
公式 :
ℎ𝑢=1+∑ℎ𝑣×𝑝𝑟𝑖𝑚𝑒𝑠𝑖𝑧𝑣
Hu = 1 + sigma( Hv * prime[sizev] ) 其中prime[sizev]表示第sizev个质数 而线性筛筛300W时就能跑出20W个质数。
(据说该公式没法被hack掉的)
其他的一些树哈希题目
【BZOJ - 4754】独特的树叶(树哈希)