[14/07/19] 字符串学习笔记(1)
循环节相关。
解决此类问题一般有两种方法。
KMP
我们知道,对于 \(KMP\) 算法而言,\(nxt[i]\) 要记录的是区间 \([1,i-1]\) 的最长共同前后缀。那么对于 \(nxt[]\) 中的 \(i\),若符合 \(i\) % \(( i - nxt[i] ) == 0\) 且 \(nxt[i] != 0\) , 则说明字符串循环,而且循环节长度为: \(i-nxt[i]\)。
哈希
把串复制两遍,设枚举到的循环节为 \(x\) ,匹配 \([L,R-x-1]\) 与 \([L+x+1,R]\) 是否相等。因为 \([L+x+1,R-x-1]\) 为重复,所以实则就是匹配了 \([L,L+x]==[L+x+1,L+2x+1]\),以此类推。