NOIP 编号为 ZJ-267 的小 Z 在 NOIP 中 AK 啦!
小 Z 打算去冲击省选,于是开始学习 trie 。
有一天,他得到了 个字符串。
他先建立一个根节点,对于每一个字符串,他都从根节点开始一点点插入。
小 Z 不满足于此。他的大脑里盘旋着 个问题:
如果给定一个二元组 ( , 都是 trie 中的节点且 是 的祖先),存在多少个二元组 ( , 都是 trie 中的节点且 是 的祖先),满足 ~ 路径上的字符串和 ~ 路径上的字符串完全一样?
注意 可以等于 , 也可以等于 。
Constraints
,
Solution
先构建出 trie ,然后在 trie 上面建 sam。分别需要记录下原串的每个节点在 trie 上的位置和 trie 上的每个节点在 sam 上的位置。
对于一个询问,从 对应在 sam 上面的节点开始,在 parent 树上跳直到深度最浅的满足节点对应长度不小于询问串的节点为止,该节点的 right 集合大小即为答案。
Code
1 |
|