• [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})\)

  • 相关阅读:
    oracle sql日期比较
    rlwrap真是一个好东西
    Dataguard 归档丢失处理
    oracle latch工作原理
    Latch free等待事件
    Redhat Enterprise Linux 5 安装 Oracle 10g release 2
    oracle 日期问题
    Oracle自动存储管理 ASMLib的支持变化
    [官方文档] oracle官方文档总汇(9i,10g,11gR1, 11gR2)
    实时分布式搜索引擎比较(senseidb、Solr、elasticsearch)
  • 原文地址:https://www.cnblogs.com/LinZhengyu/p/15993891.html
Copyright © 2020-2023  润新知