**:
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...