这题数据有点毒瘤啊……
以后数组大小要开双倍……
首先考虑设 ai 表示有多少个以第 i 个字符结尾的如此 AA 串,设 bi 表示有多少个以第 i 个字符开头的。
显然答案即 n−1∑i=1aibi+1。
然鹅作为一道良心题,求 a,b 暴力哈希就可以 95pts 了……
好的我们讲正解。
考虑枚举 AA 串的 |A| 为 w,我们把每个 w|i 的下标 i 都抽出来。
那么任意一个 AA(|A|=w) 都跨过了相邻的两个这样的下标。
于是我们可以考虑对这些下标算贡献。
考虑相邻的两个点 l,r=l+w,设 lcp 为后缀 l,r 的 LCP 长度,lcs 为前缀 l,r 的 LCS 长度。
如果 lcp+lcs<w,那么这两个点就没有贡献。
如果 lcp+lcs≥w,那么这两个点就会有贡献,而且因为 lcs 和 lcp 可能有一部分重叠,所以我们可以继续平移这个 AA 串,最多可以平移重叠的长度位。
(画个图感性理解一下……)
这样的话就会在 a,b 上各有一个区间的贡献 +1,差分即可。
很多细节,还是那句话:画图!
代码:
1 |
|