[loj #6296] 迷失的字符串 另解

题目链接

随便尝试一下,能得到两个暴力做法:

一是枚举起点 \(u\) 对原树进行 dfs 求所有以 \(u\) 为起点的字符串,对询问串建 Trie 树后再在 dfs 出的字符串的对应位置标记即可。\(O(\sum |S|)\) 预处理后算法时间复杂度 \(O(n^2)\)

二是对树的所有路径进行点分治,每次判定每个询问串是否对应一条过分治中心的路径。

判定可以考虑使用哈希表维护所有从分治中心出发的字符串,之后枚举分治中心在询问串上的位置来解决。注意要保证分治中心前后的部分不在同一子树内,哈希表再多维护每个字符串出现在哪些子树内(大于 \(2\) 个只要维护 \(2\) 个)即可。

时间复杂度 \(O(n\log n+n\sum |S|)\)

注意到一算法适合 \(n\) 较小的情况而二算法适合 \(n\) 较大的情况。设定一个常数 \(B\),当 \(n< B\) 时执行一算法,当 \(n\ge B\) 时执行二算法,则一算法总时间复杂度 \(O(\frac{n}{B}B^2)=O(nB)\)

二算法总时间复杂度较难计算,但注意到子树大小在 \([B,2B)\) 的点分树上点数量不超过 \(\frac{n}{B}\),子树大小在 \([2B,4B)\) 的点分树上点数量不超过 \(\frac{n}{2B}\),以此类推,所以子树大小 \(\ge B\) 的点分树上点数量不超过 \(2\frac{n}{B}\),故二算法总时间复杂度 \(O(n\log n+\frac{n}{B}\sum |S|)\)

由于 \(\sum|S|\)\(n\) 同阶,所以当 \(B\)\(\sqrt{n}\) 时拼合后算法总时间复杂度达到 \(O(n\sqrt{n})\)

posted @ 2022-03-11 15:28  林政宇  阅读(63)  评论(0编辑  收藏  举报