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) 注意临时变量被修改所引发的惨案

原文地址:https://www.cnblogs.com/tmzbot/p/4373498.html