首页 > Web开发 > 详细

JSOI 2008 火星人prefix

时间:2015-03-28 01:10:06      阅读:317      评论:0      收藏:0      [点我收藏+]

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.

JSOI 2008 火星人prefix

原文:http://www.cnblogs.com/tmzbot/p/4373498.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!