@bzoj - 1921@ [ctsc2010]珠宝商
目录 @description@ @solution@ @accepted code@ @details@ @description@ 简述版题意:给定字符串 S 与一棵树 T,树上每个点有一个字符。求树上所有简单路径对应的字符串在 S 中的出现次数之和。 原题链接。 @solution@ 一个显然的暴力:O(N^2) 枚举所有点对的字符串,建后缀自动机跑算出现次数之和。 另一个看起来比较好的算法:点分治。 每次计算经过重心的字符串,可以拆成两部分:某个点到重心的字符串 + 重心到某个点的字符串。 不过合并的时候需要在原字符串 S 上找分界点(不然无法合并),该算法执行一次复杂度为 O(M)。 接下来?发现并没有什么更好的性质可以利用。 数据范围比较小,我们不妨考虑一些玄学的操作:平衡复杂度。 在点分治时,如果当前连通块大小 < \(\sqrt{M}\) 则执行第一种暴力,否则执行第二种暴力。这样平衡下来复杂度为 \(O(N\sqrt{M})\) 。 看起来比较显然:连通块大小 < \(\sqrt{M}\) 时 O(size^2) 优于 O(M);否则 O(M) 优于 O(size^2)。 至于复杂度的正确性,第一种暴力的总和显然 \(O(N\sqrt{M})\) 。第二种暴力由于决策树的叶子个数 <= \(O(\sqrt{M})\) ,而深度为 logN(点分治),所以也是 \