这是一个未被验证过正确性的判断有根树同构的哈希函数。可以记忆化搜索或者dfs求得。
f(u)表示以u为根的子树的哈希值。
size(u)表示以u为根的子树的大小。
son(u)表示u的儿子数量。
chi表示u的第i个儿子。
p为种子。
O(n)。
typedef unsigned long long ull;
#define N 100001
const ull seed=127;
ull f[N],seeds[N];
void dfs(int U)
{
size[U]=1;
int t=0;
for(int i=first[U];i;i=next[i])
{
dfs(v[i]);
f[U]+=f[v[i]]*seeds[size[U]-1];
size[U]+=size[v[i]];
}
f[U]+=seeds[size[U]-1]*(son[U]+1);
}