之前一篇KMP講的是直接的應用,這一篇將借助兩道相似的POJ題目對next數組進行深入一些的討論。
兩道題目分別是:
POJ 1961 2406,題意是給出一個串s,找出這個能表示成某個字串A的K次聯接,即s=[A...A] (K個A),要求K最大,即A最小。
暴力可以過2406,但1961沒法過,超時。
看了discuss的討論,只要計算KMP算法中的next數組,判斷n (串長)能否被d = n-1-next[n-1] (即最后一個next)整除,若能,則s是s[next[n-1]...n-1]的n/d聯接。具體細節沒有證明。
下面給出我的一些想法,為什么以上判斷是正確的。
首先,若s可以表示成[A...A],則next數組確實是符合以上整除的要求的,且從0到next[n-1]這個proper prefix (見上一篇KMP文章的定義)是s的最長的proper suffix。
其次,為什么d整除n,就能斷定s是s[next[n-1]+1...n-1]的n/d次聯接呢?
1) 用文字表述太麻煩,用下圖說明
圖中顏色一致的段是一樣的(這是因為下面那段是上面那段的proper prefix),即上面的1等于下面的1,而由于下面的段是上面段的proper prefix,因此下面的1又等于上面的2,所以上面的1跟2是相等的。以此類推,上面的小段都是相等的。