zoukankan      html  css  js  c++  java
  • [POJ2406&POJ1961]用KMP解决字符串的循环问题两例

    翻阅了一下网上资料,发现大部分都说这题是找规律...或是说YY出的一个算法..不会证明...

    然后就脑补了一下证明 ~


    结论:对于一个字符串S[1..N],如果N mod (N-next[N])=0 则存在循环并且长度为N-next[N]的循环。

    脑补的证明:

          首先必要性很显然,如果N mod (N-next[N])<>0显然不存在循环。

                      

      如图红色区域为N-next[N]长度的字符串。根据KMP造出的next数据的性质,S[1..next[n]]=s[n-next[n]+1..n],其长度相同的后缀也相同,即橙色区域与红色区域相同。把黄色区域+橙色区域看成一块,横色区域+红色区域看成一块,也为长度相同的后缀,于是黄色区域+橙色区域=橙色区域+红色区域,黄色区域=橙色区域=红色区域……依次类推,可证明所有的长度为n-next[n]的区域都同构。

     

      附上萌萌哒代码



      另外有一道加强版的题目,POJ1961.问字符串每个前缀的循环。

      第一眼看起来感觉复杂度会乘上n,实际上不然,我们之前预处理出next数组的时间复杂度是O(n),然而对于询问是O(1)回答的。

      我们发现之前预处理出来的数组对前缀求循环完全有用,所以这道题无非是回答n遍。写起来由于求出来的东西充分展现了利用价值反而更爽了。

  • 相关阅读:
    Shell学习(八)——dd命令
    PLSQL导出oracle表结构和数据
    如何让Linux 机器CPU使用率变高
    WebService学习总览
    Java发HTTP POST请求(内容为xml格式)
    Oracle—回车、换行符
    Oracle—merge into语法
    Apache解析和绑定域名
    MySQL根据经纬度按距离排序
    jquery监听input
  • 原文地址:https://www.cnblogs.com/mjy0724/p/4369707.html
Copyright © 2011-2022 走看看