【树同构问题】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】独特的树叶(树哈希)

cf 762 F

posted @ 2022-04-26 13:10  Newuser233  阅读(59)  评论(0编辑  收藏  举报