不难想到把最终在 \(S\) 从中间分开,就变成了前后两个 broder 拼起来。
考场重现:
直接把所有的 broder 求出来,将相同长度的 broder 的下标存在一起,然后暴力匹配,最后还没来及优化。
考场代码(除了 fail 树,其她其实都挺逼近正解
正解是建出 fail 树(甚至搞忘还有这东西),然后一个点所有的 broder 就是到根的路径,那么子树即是包含这个长度的 broder 的所有点。
将正向 fail 树中的编号都自加 \(1\),这样原问题等价于查询在两个子树相同的点的数量。
具体实现的话,在 fail 树 A 上按 dfn 序维护同样的编号在 fail 树 B 上的 dfn,然后查询在 fail 树 A 的 \(x\) 的子树中有多少在 \(y\) 子树的范围内。
标签:HDU,子树,7084,题解,broder,fail From: https://www.cnblogs.com/CloudWings/p/18048745