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遍。写起来由于求出来的东西充分展现了利用价值反而更爽了。

  • 相关阅读:
    Leetcode: Word Ladder II
    Leetcode: Triangle
    Leetcode: Best Time to Buy and Sell Stock II
    Leetcode: Best Time to Buy and Sell Stock
    Leetcode: Pascal's Triangle II
    Leetcode: Pascal's Triangle
    Leetcode: Path Sum II
    Leetcode: Convert Sorted Array to Binary Search Tree
    Leetcode: Merge Sorted Array
    Leetcode: Word Search
  • 原文地址:https://www.cnblogs.com/mjy0724/p/4369707.html
Copyright © 2011-2022 走看看