「HDU-6661」Acesrc and String Theory
给定一个串,问由k个循环节组成的子串数量
题解
考虑找到一个由循环节构成的联通块。枚举循环节长度$i∈(1,n/2)$,找到区间$[L,R]$为某个循环节长度为$i$的极大循环节(向右能够扩展的长度小于$i$),求得$extR=lcp(s(L),s(R+1))$为该串可以向右扩展的最大长度,并翻转原串求出向左扩展的最大长度$extL=lcp(revs(n+1-R), revs(n+1-L+1))$,那么求出的块为$[l,r]$为$[L-extL,R+extR]$。当前块对答案的贡献为“长度为$r-l+1$的串中长度为$k×i$的子串个数”,即$(r-l+1)-k×i+1$。
当$k=1$时需要特判。
代码
1 |
|