再做POJ2406 KMPnext陣列的運用

2021-07-23 22:39:35 字數 1357 閱讀 6066

這道題在很久之前就做過,由於那時候還沒有仔細研究kmp以及對next陣列的理解,所以當時也是留下了這個問題,最近《資料結構》上到串,老師提到這個演算法,但是沒有講,下來後,我覺得是時候看下這個演算法了。

題目大概意思就是求給出的字串最大迴圈節。比如「ababab」就是由3個「ab」相連而成,所以輸出3,「abcdef」只能看作乙個「abcdef」所以輸出1。

具體kmp的意義和next陣列的學習筆記和理解筆記寫在筆記本上,這裡我就直接引用其他人的說法:

kmp中next陣列的巧妙運用。在這裡我們假設這個字串的長度是len,那麼如果len可以被len-next[len]整除的話,我們就可以說len-next[len]就是那個最短子串的長度

為什麼呢? 假設我們有乙個字串ababab,那麼next[6]=4對吧,由於next的性質是,匹配失敗後,下乙個能繼續進行匹配的位置,也就是說,把字串的前四個字母,abab,平移2個單位,這個abab一定與原串的abab重合(否則就不滿足失敗函式的性質),這說明了什麼呢,由於字串進行了整體平移,而平移後又要重疊,那麼必有

s[1]=s[3],s[2]=s[4],s[3]=s[5],s[4]=s[6].說明長度為2的字串在原串中一定重複出現,這就是len-next[len]的含義!

這個說法的確很犀利,很到位。詳情理解參照kmp筆記第四頁對abab的next[4]=2的運用。

注意的是,next[0]一般人工賦值-1,所以next陣列是平移過的,陣列下標對應字串的序號,序號是從1開始,比如ababac,next[6]對應的是c(其實代表ababc),next[5]對應的是a,next在這裡對ababac進行模擬下,ababac對應next陣列001230,next[6]=0,沒有可以平移重疊的模式串的字串,輸出1。對ababac的分析看筆記第四第五頁。

筆記:

再做POJ2406 KMPnext陣列的運用

這道題在很久之前就做過,由於那時候還沒有仔細研究kmp以及對next陣列的理解,所以當時也是留下了這個問題,最近 資料結構 上到串,老師提到這個演算法,但是沒有講,下來後,我覺得是時候看下這個演算法了。題目大概意思就是求給出的字串最大迴圈節。比如 ababab 就是由3個 ab 相連而成,所以輸出3...

再做POJ2406 KMPnext陣列的運用

這道題在很久之前就做過,由於那時候還沒有仔細研究kmp以及對next陣列的理解,所以當時也是留下了這個問題,最近 資料結構 上到串,老師提到這個演算法,但是沒有講,下來後,我覺得是時候看下這個演算法了。題目大概意思就是求給出的字串最大迴圈節。比如 ababab 就是由3個 ab 相連而成,所以輸出3...

poj2406 kmp,字尾陣列

開始是用字尾陣列做的,rmq果斷超了記憶體,全部改用unsigned short結果又超時,後來參考了 裡的方法。關鍵思想是設k為最小重複字串的長度,則s 0,1 n k 1 s k,k 1 n 1 即lcp rank 0 rank k n k 由於0位置是固定的,只需要對名次迴圈求出最小的k就行!...