zoukankan      html  css  js  c++  java
  • 有关字符串循环节的一些性质

    我们最常用的求一个字符串循环的算法是kmp。

    结论:

    设$len=n-nxt[n]$

    (1) $nxt[n]=0$  不存在循环节

    (2) $nxt[n]>0$ $&&$ $n\%len eq0$ 存在循环节但是长度不整除

    (3) $nxt[n]>0$ $&&$ $n\%len=0$ 存在整除循环节

    而且更长的循环节一定是$len$的倍数。

    证明1:若为(2),那么不存在一个长度更长的循环节使其整除。

    一个小性质:对于(2),(3)情况,则$forall 1leq l leq r leq n$,$S[l,r]$满足(2),当$(r-l+1)\%len=0$时满足(3)。

    考虑反证法,证明不存在整除循环节$len$,满足$exists nxt[n]>n-len$。

    (1)$len\%(n-nxt[n])=0$,显然矛盾。

    (2)$len\%(n-nxt[n]) eq 0$,设$x=n-nxt[n]$。

    $S[1,len]$和$S[len+1,2*len]$之间产生$S[1,x]$的前后缀相等,设其长度为pre。

    考虑证明$nxt[n]=n-x+pre$,只需证明$S[x-pre+1,2*x-pre]=S[1,x]$即可,也是用$S[1,len]$和$S[len +1,2*len]$交叉的证明。

    都推出了矛盾就证完了。

    证明2:若(1),则所有整除循环节长度是$len$的倍数。

    证明与证明1非常类似,都是以推出更长循环节为矛盾的。

    但有时我们并不满足于对于一个串$|S|$以$O(n^2)$的复杂度搞出所有子串的循环节。

    设以$i$为左端点开始的子串不同最小循环节的个数为$g(i)$。

    结论:$sum_{i=1}^{n}g(i)$是$n*logn$级别的。

    证明:我想证明$g(i)$是logn级别的,但是遇到了瓶颈啊。。。

  • 相关阅读:
    容器基础(三): 使用Cgroups进行资源限制
    如何使用微软认知服务
    【PAT甲级】1004. Counting Leaves (30)
    PAT 1003. Emergency
    蓝桥杯2017模拟赛-风险度量
    HDU1242 Rescue
    HDU2437 Jerboas 深度优先遍历 + 剪枝
    HDU1257 最少拦截系统
    HDU1789 Doing Homework again
    UWP 打开、保存文件示例
  • 原文地址:https://www.cnblogs.com/asd123www/p/10249761.html
Copyright © 2011-2022 走看看