st表
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
ural1297Palindrome (后缀数组+lcp)
求最长回文子串,且此题要求最先出现,SA+lcp解决。原想法:首先反转,拼接原串与反转串,然后求两者的最长公共前缀,唯一注意的是如果有多组要输出最先出现那一组。原想法是错误的。反例:zzzdzaadzzz。可以自己摸索下,实在不行,来这位大神博客下拜读一下也是可以的。传送门正解:首先要在本身与镜像之间插入一个特殊的,不可能出现的字符。我们枚举每一个原始字符串中的字符以它为中心(原创 2017-07-17 21:43:15 · 280 阅读 · 0 评论 -
bzoj4569 [Scoi2016]萌萌哒(并查集+倍增)
考虑暴力做法,就是每次把对应位置都用并查集合并了。最后答案就是9*10^(连通块个数-1)。然而这样太暴力了,怎么优化呢? 我们考虑倍增的思想,用id[j][i]这个点表示j…j+(1< < i)-1这一段。我们每次合并两个对应区间时,变成合并logn个对应区间。 最后再从上往下推到i=0.即如果id[x][i]和id[y][i]联通,则id[x][i-1],id[y][i-1]也联通,id[x原创 2018-04-27 09:38:20 · 338 阅读 · 0 评论 -
bzoj2006 [NOI2010]超级钢琴(st表+堆)
求连续子段和的前K大。 做个前缀和,把子段和变成sum[r]-sum[l]。 考虑r=i时,左端点一定是在一个范围内选一个最小的。 可以用st表+rmq来O(1)得到。 我们把这些扔进优先队列贪心取最大即可。 考虑对于i我在可选择区间[l,r]选了x之后,选别的还有可能在前k大。可是我们很难把x删掉。于是我们把[l,r]分裂成两半[l,x-1],[x+1,r]。即可。 因此我们优先队列需原创 2018-05-02 20:11:16 · 308 阅读 · 0 评论 -
NOIP模拟9.28
2013提高D2 A.积木大赛(模拟+递归+st表)AC B.花匠(贪心)AC C.华容道(bfs+spfa)40.搜索手残写挂,本来有70分的。原创 2017-09-28 20:51:31 · 277 阅读 · 0 评论 -
CF204E Little Elephant and Strings(同bzoj3277)
原题,还写了好久orz。传送门原创 2017-10-07 14:11:41 · 585 阅读 · 0 评论 -
bzoj3277&&bzoj3473 串(SA+二分+lcp)
首先老套路,我们把所有串接在一起,用分隔符隔开,做SA,求出h数组,并用st表求lcp。然后分析题目,我们对于每个串分别统计答案。假定我们正在做第i个串,在总串中从sta开始,到ed结束。则我们要求的就是每个后缀a[sta…ed],a[sta+1…ed]…a[ed]对答案的贡献和。假设我们在求a[j…ed]这个后缀的贡献。则他的贡献就是有几个前缀出现在k个及以上不同串中,显然如果a[j..j+len原创 2017-08-26 14:22:20 · 563 阅读 · 0 评论 -
bzoj2119 股市的预测(SA+lcp)
走势相同,要进行差分,数的范围太大,还要离散化,然后就是求有多少子串样子是ABA,且B的长度已给定。枚举A的长度x,统计所有A的长度为x的答案。 我们以x对原串进行分块,每一块的第一个点设为关键点,我们发现对于一个ABA,第一个A一定覆盖且只覆盖一个关键点,我们枚举关键点i,i和i+mm+x往左往右匹配长度l和r(r包括关键点),如果l+r>=L那么这个地方就有l+r-x+1个满足的子串。因为要避原创 2017-08-15 00:01:35 · 557 阅读 · 0 评论 -
bzoj2534 Uva10829L-gap字符串(SA+lcp同bzoj2119)
求形如ABA的子串个数,同bzoj2119,题解看这里 tips:没说全是小写字母你就别换成int了。。。无谓的WA三发#include原创 2017-08-24 17:00:16 · 417 阅读 · 0 评论 -
vijos1514 天才的记忆(st表求rmq板子)
求区间最大值,st表板子原创 2017-08-11 20:15:42 · 447 阅读 · 0 评论 -
bzoj3230 相似子串(SA+lcp+二分)
首先用后缀数组处理出h数组。因为要问子串的排名,所以我们再记一个数组num[i],表示前i个后缀有几个本质不同的子串。然后我们用二分查找就可以找到排序后的第i个子串是谁了。然后就是求一下lcp了。。还有反过来的lcp。。算清角标就好了。。还有很坑的一点:可能有超过int范围个实质不同的字串=,=.#include <cstdio>#include <cstring>#include <algor原创 2017-08-03 16:20:00 · 457 阅读 · 0 评论 -
poj3693(后缀数组+lcp+rmq)
求循环节个数最大的子串。先穷举长度L,然后求长度为L 的子串最多能连续出现几次。首先连续出现1 次是肯定可以的,所以这里只考虑至少2 次的情况。假设在原字符串中连续出现2 次,记这个子字符串为S,那么S 肯定包括了字符r[0], r[L], r[L*2],r[L*3], ……中的某相邻的两个。所以只须看字符r[L*i]和r[L*(i+1)]往前和往后各能匹配到多远,记这个总长度为K,那原创 2017-07-18 18:56:12 · 725 阅读 · 0 评论 -
SPOJ687 Repeats (后缀数组+lcp)
求循环节个数最大的子串的循环节个数。很绕吧。。基本和poj3693相同,此题要简单些。因为我先看了hzw的poj3693的题解。。所以我也写的是反过来做一遍求l。先入为主了呢。。网上还有很多人写的其实不需要反过来做一遍去求l,大家可以去借鉴下。。我觉得时间上差不多。。所以就懒得改了呢。。(思路有问题还是参考3693吧。。)#include #include #define N 50010原创 2017-07-18 18:48:11 · 387 阅读 · 0 评论 -
bzoj5073 [Lydsy1710月赛]小A的咒语(SA+lcp+dp+贪心)
考虑dp,f[i][j]表示A串前i字符分成j段能匹配的最大B串前缀长度。 那么如果i+1不选,转移到f[i+1][j]如果i+1选,则我们可以贪心的尽量多匹配一些,即匹配t=lcp(i+1,f[i][j]+1)个,转移到f[i+t][j+1]我们SA+RMQ预处理一下,O(1)查询lcp即可。复杂度O(T(nk+nlogn))O(T(nk+nlogn)) 注意多组数据的一些细节,比如rk要清零原创 2018-04-27 22:01:05 · 331 阅读 · 0 评论