zoukankan      html  css  js  c++  java
  • JSOI 2008 火星人prefix

    FROM http://www.lydsy.com/JudgeOnline/problem.php?id=1014

    LCP问题

    给定串 S[0..n] , 对于一对(a,b)其中0<a,b<n,求一个最大的k使得S[a..a+k]=S[b..b+k]

    解决方法: Hash加二分

    对于每个子串,我们都可以用基于多项式模大素数的hash函数进行判重.

    静态LCP

    静态LCP可以用DP二分解决.[详见 CQF `New LCP']

    动态LCP

    type1 查询居多,修改少. CQF解决方案. [详见 `New LCP']

    O(log n)查询,O(n)修改.

    type2 修改多,查询少.

    可以使用O(log2n)算法查询,O(log n)修改.

    ===================================

    注意数据范围.

    共10W操作,1W查询.显然是属于type2的.

    每次查询二分长度,O(log n).二分检验用splay维护hash值,O(log n).总复杂度O(log2n).

    修改用splay维护lazy tag,一遍rotate一遍计算.O(log n).

    注意,此hash值基于如下基础: 将splay树中序成序列,每一棵子树对应一段区间.hash值是区间内串的hash值.

    注意splay可以非常轻松地取出区间进行区间操作,完全可行.

    PS 27的幂可以预处理.

    PPS 用long long+大素数模显然可以涨RP.

    PPPS 调试中出现的问题

    1) splay函数必须加参数to

    2) 注意临时变量被修改所引发的惨案

  • 相关阅读:
    洛谷P1514引水入城
    洛谷P2827蚯蚓
    外部排序总结
    桶排序
    基数排序
    计数排序
    搜索文件-读目录的使用
    堆排序
    甲乙用同一串数字玩游戏
    Cracking the Coding Interview 8.7
  • 原文地址:https://www.cnblogs.com/tmzbot/p/4373498.html
Copyright © 2011-2022 走看看