loj2083 优秀的拆分 [NOI2016] SA

正解:SA

解题报告:

我永远喜欢loj!

显然$AABB$串相当于是由两个$AA$串拼起来的,所以可以先考虑如果求出来了所有$AA$串怎么求答案?

就假如能统计出$st[i]$表示所有以$i$为开头的$AA$串的个数,$en[i]$表示所有以$i$为结尾的$AA$串的个数,$ans$就会等于$\sum en[i]\cdot st[i+1]$,$O(n)$地求下就好$QwQ$

于是现在的目标就是快速地求出$st$数组和$en$数组辽

这儿有四个方法(两个暴力+两个正解),大概会分别港下$QwQ$

第一个暴力就很$easy$啊,就字符串的题想不出来正解的时候自然而然就会想到用哈希乱搞一通,,,?

这题的话哈希就非常无脑啊,$O(n^{2})$做下就好,,,

瞎解释下趴,就以$st$为$eg$,先循环一个$i$表示起始位置,然后循环一个$y$表示长度,判一下$str[i\sim i+j-1]$484等于$str[i+j\sim i+2\cdot j-1]$就好

然后这就有95$pts$了,,,

然后对于这个暴力,其实优化下就有100$pts$了

就一般来说看到哈希,自然而然就再想到二分+哈希?于是就更进一步,考虑如果用二分优化下怎么搞

首先考虑到每次先枚举长度$l$,然后每隔$l$设一个关键点,那么显然每个长度为$2\cdot l$的串$AA$一定会经过两个关键点

于是考虑对每个关键点求出它和前一个点前缀的最长公共后缀和后缀的最长公共前缀,这儿显然是可以哈希求的不说

然后判一下,如果$lcp$的长度和$lcs$的长度之和大于等于$l$就说明可以组成,然后因为有多次修改但只有一次输出,$so$可以差分下

然后就做完辣!

然后如果能get这个想法,就可以想到,显然$SA$也是可做的鸭$QwQ$

就现在从这个$hash$可以看出,其实现在的瓶颈就快速求出相邻两点的$lcp$和$lcs$嘛,然后上面是用了个二分+哈希搞过去了

那就显然考虑用$SA$,欧克水过去辣!

(听说$SA$能做的$SAM$都能做,,,?$so$也许学了$SAM$之后我还会来$upd$下$SAM$的$code$趴$QwQ$

说得有些简略,,,也麻油放代码,,,然后$kmp$的做法也还麻油写,,,

期中考完如果还没退组再仔细写下然后放代码趴$QAQ$

上一篇:【CodeVS 1199】【NOIP 2012】开车旅行


下一篇:全局程序集缓存GAC