[NOI2016]优秀的拆分
分析
这道题不管采用Hash,后缀数组还是自动机,网上大部分的题解都采用了关键点+调和级数这个操作。本蒟蒻想不到关键点这个操作,所以采用的是一种较为繁琐的 O ( n l o g 2 ) O(nlog^2) O(nlog2)做法。
首先肯定将问题转化成对于每个 i i i求以 i i i为边界的 A A AA AA结构个数,当然前缀后缀分别求一遍,以下默认是前缀。
考虑形式化这个问题,对于某个前缀 i i i,求所有的前缀 j ( j < i ) j(j<i) j(j<i),使得 i , j i,j i,j的最长公共后缀的长度大于 j − i j-i j−i,也就是 ∣ { j ∣ j < i , i − j ≤ ∣ L c s ( S 1 , j , S 1 , i ) ∣ } ∣ |\{j|j<i,i-j\le |Lcs(S_{1,j},S_{1,i})|\}| ∣{ j∣j<i,i−j≤∣Lcs(S1,j,S1,i)∣}∣
对于后缀前缀的问题,我们一般将他们放到后缀自动机的 p a r e n t parent parent树上考虑,由于后缀自动机的 p a r e n t parent parent树相当于是将每个前缀逆序插入 T r i e Trie Trie,所以某两个前缀的 L c s Lcs Lcs对应的就是他们 p a r e n t parent parent树上的