AtCoder Beginner Contest 367 题解(E~G)

E

转换关系看作有向边,\(n\)\(n\) 边构成基环树森林,基环树k后继唯一,于是题目就变成了k祖先问题,记 f[i][j] 为点 \(i\)\(2^j\) 级祖先,随便倍增。

也可以基环树上找环 \(O(n)\) 做,但是目测不好写。

F

一眼哈希,不知道有没有不哈希的做法。

在这里我们不关心元素的顺序,只关心元素出现次数是否相同,考虑一个 \(n\)\(n+1\) 进制数,\(a_i\) 出现一次就在 \(a_i\) 位上 \(+1\),最多加 \(n\) 次不会出现进位,最终得到的数就反映了元素的出现次数。在此基础上就和字符串哈希类似了,选两个素数 \(\ge n+1\) 当基数做双哈希就行了。

收集了一些 HL 群里的做法:

对原序列随机赋权,hash值是区间权值和(sum hash)或区间权值异或和(xor hash),还有人找到了原题(超级加强版)。

posted @ 2024-08-18 09:58  EnochYoung  阅读(16)  评论(0)    收藏  举报