kmp求最小迴圈節

2021-10-02 15:07:06 字數 1052 閱讀 2339

**:

kmp最小迴圈節、迴圈週期:

定理:假設s的長度為len,則s存在最小迴圈節,迴圈節的長度l為len-next[len],子串為s[0…len-next[len]-1]。

(1)如果len可以被len - next[len]整除,則表明字串s可以完全由迴圈節迴圈組成。迴圈週期t=len/l。

(2)如果不能,說明還需要再新增幾個字母才能補全。需要補的個數是迴圈個數l-len%l=l-(len-l)%l=l-next[len]%l,l=len-next[len]。

理解:對於乙個字串,如abcd abcd abcd,由長度為4的字串abcd重複3次得到,那麼必然有原字串的前八位等於後八位。也就是說,對於某個字串s,長度為len,由長度為l的字串s重複r次得到,當r≥2時必然有s[0…len-l-1]=s[l…len-1],字串下標從0開始。那麼對於kmp演算法來說,就有next[len]=len-l。此時l肯定已經是最小的了(因為next的值是字首和字尾相等的最大長度,即len-l是最大的,那麼在len已經確定的情況下,l是最小的)。

模板例題:cyclic nacklace

**://另外字串s完全由迴圈節迴圈組成時擴充套件kmp也可以求出最小迴圈節的長度及出現的次數:在原串後面再接乙個本身(不加原串的最後乙個字元),它的每乙個字尾與原串的最長公共字首長度=原串長度的次數就是最小迴圈節出現的次數

#include

#include

#include

#include

#include

#include

using namespace std;

const

int manx=

1e5+10;

char p[manx]

;int net[manx]

,lp;

void

getnext()

}int

main()

return0;

}

kmp求最小迴圈節

kmp最小迴圈節 迴圈週期 定理 假設s的長度為len,則s存在最小迴圈節,迴圈節的長度l為len next len 子串為s 0 len next len 1 1 如果len可以被len next len 整除,則表明字串s可以完全由迴圈節迴圈組成,迴圈週期t len l。2 如果不能,說明還需要...

KMP求最小迴圈節講解

kmp最小迴圈節 迴圈週期 定理 假設s的長度為len,則s存在最小迴圈節,迴圈節的長度l為len next len 子串為s 0 len next len 1 1 如果len可以被len next len 整除,則表明字串s可以完全由迴圈節迴圈組成,迴圈週期t len l。2 如果不能,說明還需要...

最小迴圈節

分類 資料結構 2013 04 05 20 01 157人閱讀收藏 舉報 acm演算法 資料結構 kmp最小迴圈節 通過kmp中的 next 陣列求最小迴圈節 題目要求 給出乙個字串,求出將字串的全部字元最少迴圈2次需要新增的字元數。cpp view plain copy print?include...