求助树哈希的换根转移
  • 板块学术版
  • 楼主2020kanade
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/23 18:25
  • 上次更新2023/10/27 06:16:15
查看原帖
求助树哈希的换根转移
456724
2020kanade楼主2022/10/23 18:25

楼主最近在学树哈希,找了个hash方式,为了过UOJ板子自己改了一下:

hashu=(1+vson(u)c(hashv))×sizeuhash_u=(1+\sum_{v\in son(u)} c(hash_v))\times size_{u} ,其中 c(x)c(x) 的实现如下:

inline ull c(int x) {return x^=x>>7,x^=x<<13,x^=x>>17,x^=a*b,x;}

其中 a,ba,b 是两个不同的随机数。

问题在于最近楼主需要对无根树的每个结点求以其为根时的整树哈希值,显然考虑换根dp,自己推了个巨丑无比的柿子:

gv=(hashv×inv(sizev)+(gu×inv(n)c(hashv))×(nsizev))×n,vson(u)g_v=(hash_v\times inv(size_v)+(g_u \times inv(n) -c(hash_v) )\times (n-size_v))\times n ,v\in son(u)

其中 nn 是整棵树大小, inv(x)inv(x)xx 的逆元(可以通过预处理避免,但是这里懒)。

请求正确性验证,楼主饭点跑过来发的帖子,自己查不出来,感谢各位......

2022/10/23 18:25
加载中...