按照 OIWIKI 的说法,其实就是给树的每一个节点定义了一个哈希值,随着子树结构不同,不同子树的根节点的哈希值不同
根节点与其子节点的哈希值之间的关系为:
f(root)=(c+∑g(son))modm
- 一般情况下 c=1
- m可以是 264 从而使得结果自然溢出
为了防止卡哈希,函数 g 会写成:
(具体模板见OI WIKI)
const ULL mask = rand();
ULL shift(ULL x)
{
x ^= mask;
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
x ^= mask;
return x;
}
靠,当年区域赛现学现卖树哈希结果到最后都没调出来,被队友唠一辈子(
补G题的时候我也调了很久(┯_┯)