楼主最近在学树哈希,找了个hash方式,为了过UOJ板子自己改了一下:
hashu=(1+∑v∈son(u)c(hashv))×sizeu ,其中 c(x) 的实现如下:
inline ull c(int x) {return x^=x>>7,x^=x<<13,x^=x>>17,x^=a*b,x;}
其中 a,b 是两个不同的随机数。
问题在于最近楼主需要对无根树的每个结点求以其为根时的整树哈希值,显然考虑换根dp,自己推了个巨丑无比的柿子:
gv=(hashv×inv(sizev)+(gu×inv(n)−c(hashv))×(n−sizev))×n,v∈son(u)
其中 n 是整棵树大小, inv(x) 是 x 的逆元(可以通过预处理避免,但是这里懒)。
请求正确性验证,楼主饭点跑过来发的帖子,自己查不出来,感谢各位......