题目:
分析:
定义把我校某兔姓神犇Tzz和他的妹子拆分,为“优秀的拆分”
随便写个哈希就能有 95 95 95分的好成绩……
我的 95 95 95分做法比fei较chang奇葩,不想浪费时间的可以忽略解法一qwq
解法一:
用 n n n个vector记录对于每个点 i i i,哪些长度 l e n len len满足 i + 2 l e n ≤ n i+2len\leq n i+2len≤n且 s t r [ i , i + l e n ) = s t r [ i + l e n , i + 2 l e n ) str[i, i+len)=str[i+len,i+2len) str[i,i+len)=str[i+len,i+2len)(即形如“ A A AA AA”)。然后,枚举开头 l l l和“ A A AA AA”的长度 l e n len len,这种情况下的的答案就是以 l + 2 l e n l+2len l+2len开头的“ A A AA AA”数量(即“ B B BB BB”)。
解法二:
这题哈希可以过的说qwq(虽然我惨遭卡常没过去)
预处理出以每个点开始和结尾的“ A A AA AA”的数量 s t [ i ] st[i] st[i]和 e d [ i ] ed[i] ed[i],那么答案就是 ∑ i = 1 l e n − 1 e d [ i − 1 ] s t [ i ] \sum\limits_{i=1}^{len-1}ed[i-1]st[i] i=1∑len−1ed[i−1]st[i]。
暴力枚举一个 A A A的长度 l e n len len,然后每隔 l e n len len个点作一个标记,共 ⌈ n l e n ⌉ \lceil \frac {n}{len} \rceil ⌈lenn⌉个。可以发现任意长为 2 l e n 2len 2len的“ A A AA AA”都会经过两个标记。枚举标记,计算相邻两标记 a a a和 b b b开头的后缀的 L C P LCP LCP(最长公共前缀)和两标记结尾的前缀的 L C S LCS LCS(最长公共后缀)。如果 L C P + L C S ≥ l e n LCP+LCS\geq len LCP+LCS≥len则存在一个“ A A AA AA”串经过这两个标记,且这些串的起始位置是连续的。简单画个图就可以发现,它们的起始位置是 [ a − L C S + 1 , a + L C P − l e n ] [a-LCS+1,a+LCP-len] [a−LCS+1,a+LCP−len]。(脑补一下,第一个 A A A的开头不能比 a − L C S + 1 a-LCS+1 a−LCS+1小,第一个 A A A的结尾不能比 a + L C P − 1 a+LCP-1 a+LCP−1大。)用差分解决区间修改。
求 L