题意分析
神题呀
这题让你求\(n\)个结点的树当中有所少个联通块是与\(m\)个节点的树同构的
首先 我们对于\(m\) 枚举根节点
然后 ? ? ? 树上哈希鄙人也震惊到了
我们对于当前节点
搜出所有的儿子后 把儿子的哈希值\(sort\)一遍(防止重复)
然后暴力合并
同时我们对于形态相同的子树需要用阶乘防止重复
哈希完之后 如果当前已经出现了 我们就\(continue\)
用\(set\)维护一下就可以了
然后我们从遍历\(n\)个节点的树
我们树形\(dp\)考虑如何合并
注意 难点来了
我们考虑 当前遍历到了\(n\)树\(now\)这个点
同时令\(m\)树的\(j\)点同其匹配
先提取出当前\(j\)节点的儿子 然后状压一下
我们同时从左往右扫描
我们同时扫描如果当前的\(i\)同\(j\)的儿子不匹配的话
我们就加上原来的值
否则的话
就是当前\(j\)的儿子同\(i\)匹配的方案数* 原有未匹配的方案书
这里比较麻烦 待会在代码里会详解
然后我们累加即可
最后累加到对答案的贡献里
CODE:
#include #include #include #include #include #include #include #include #include
HEOI 2019 RP++