oj:https://gxyzoj.com/d/hzoj/p/3575
因为自己的脑残原因,调了8个小时啊!!!
切入正题
Part 1
假定1为根,可以发现,如果u的两棵子树同构,则他们遍历的顺序不影响答案
所以,就可以将子树按哈希值分类,这道题就变成了一个可重复组合问题,
设\(f_i\)表示以1为根时i的方案数,\(a_i\)表示某一种哈希值的个数,\(cnt_u\)表示u的子节点数,式子:
\[f_u=\dfrac{cnt_u!}{\prod_{i=1} a_i} \times \prod_{v\in son(u)} f_v \]Part 2
若以两个节点i,j为根,两棵树同构,则方案不能重复计算,所以考虑计算以每个节点为根的哈希值
因为n很大,所以不能暴力,考虑树形dp
分为子树外的贡献和子树内的贡献,子树外的显然是父亲为根的贡献\(rt_{fa}\)减去该点所在子树的贡献,子树内的则可以直接dfs求解
所以:rt[u]=h[u]+get_hash(rt[fa]-get_hash(h[u]));
Part 3
接着考虑,因为n很大,所以不能像第一部分一样暴力跑所有点,考虑树形dp
思路和第二部分很像,分为子树内和子树外考虑
先考虑子树外
标签:rt,子树,Part,Tree,子树外,Bracket,为根,哈希,Sequences From: https://www.cnblogs.com/wangsiqi2010916/p/18107254