KMP_next数组应用_最小循环元

版权声明:本文为博主原创作品, 转载请注明出处! https://blog.csdn.net/solider98/article/details/83785624

    循环元: 如果一个字符串S是由字符串T重复k次构成, 则称T是S的循环元, 长度最小的T称为S的最小循环元, 此时k最大

    结论1: 字符串S[0...n - 1]有长度为len的循环元的充要条件是len整除n且S[0...n - 1 - len] = S[len...n - 1]. (该结论较易证明, 此处不再赘述证明过程)

    结论2: 字符串S[0...n - 1]的所有循环元的长度必为其最小循环元长度的整数倍

    证明: 假设字符串S的最小循环元为C[0...u - 1](u > 1), S存在循环元D[0...v - 1], v > u, v \, mod \: u \equiv q, q > 0,  显然S至少由2个D连接而成, 且S至少由3个C连接而成, 且S[v...v + u - 1] = C[q]...C[u - 1]C[0]...C[q - 1] = C[0...u - 1], 也即如下等式组成立:

    C[0] = C[q]

    C[1] = C[q + 1]

    ......

    C[u - 1- q] = C[u - 1]

    C[u - q] = C[0]

    ......

    C[u - 1] = C[q - 1]

    根据上述等式组可得, 对所有0 <= i <= u - 1, 均有C[i] = C[(i + q) mod u], 设w为u和q的最大公约数, 如果w为1也即w和u互质, 那么C[0] = C[q mod u] = C[2q mod u] = ... = C[(u - 1)q mod u], 假设存在a, b满足: 0 =< a < b < u且aq mod u = bq mod u, 那么

u | (b - a)q, 又u与q互质, 则u | (b - a), 这显然与0 =< a < b < u矛盾, 因此0, q mod u, ..., (u - 1)q mod u两两不等,则C[0] = C[1] = ... = C[u - 1]这显然与C为最小循环元矛盾, 因此w = 1不成立, 应有w > 1.

    设u = pw, w > 1, 考虑有C[i] = C[(i + q) mod u] = ... = C[(i + (p - 1)q) mod u], 0 <= i < w, 假设存在c,d满足: 0 <= c < d < p

且(i + cq) mod u = (i + dq) mod u, 那么u | (d - c)q, 故应有p | (d - c), 这显然与0 <= c < d < p矛盾, 故i, (i + q) mod u,...,(i + (p - 1)q)  mod u两两不等. 另一方面, w | q, u = pw, 则u | pq, 故(i + pq) mod u \equiv i. 设集P_{i} = {C[i + jq] | 0 <= j < p}, 0 <= i < w

    设T = k + jq = gu + z, (0 <= k < w, j >= 0, g >= 0, 0 <= z < u), 因为w | q, w | u, 则T = i + rw,  u = tw, 则T = gtw + z

,T - gtw \equiv z mod w, 也即i \equiv z  mod w, 这表明集P_{i} = {C[i + jw] | 0 <= j < p}, 也就是说w是C的一个循环元, 这显然与C为最小循环元矛盾, 因此w > 1亦不成立.

   综上述,  S存在循环元D[0...v - 1], v > u, v mod u \equiv q, q > 0为假, 结论2得证.

   结论3: 如果字符串S[0...n - 1]存在循环元, 那么其循环元长度从小到大依次为, n - nex[n - 1], n - nex[nex[n - 1],...,

   证明: 采用证明结论2过程中得出的结论, 即将字符串S的最小循环元循转任意长度均与旋转前不等, 即可证明此结论. 此处不再赘述证明过程.

猜你喜欢

转载自blog.csdn.net/solider98/article/details/83785624