最短迴圈節 KMP 實現

2021-10-05 06:16:27 字數 695 閱讀 6748

假設字串str的長度為len,則str存在最小迴圈節,迴圈節的長度cyclelen為len-next[len],迴圈子串為str[0…len-next[len]-1]

如果len可以被len - next[len]整除,則表明字串str可以完全由迴圈節迴圈組成

如果不能,說明還需要再新增幾個字母才能補全,需要補的個數cyclelen-len%cyclelen,需要補充的字串為str[len%cyclelen…cyclelen-len%cyclelen]

#include

#include

using

namespace std;

/* str 陣列的 str.length() + 1 個next陣列值 */

void

getnext

(string& str, vector<

int>

& next)

for(

int i =

2, cn =

0; i <= str.

length()

; i++

)else

if(cn ==0)

else}}

intmain()

else

system

("pause");

return0;

}

KMP 迴圈節問題

現在給你乙個字串,請問在該字串末尾最少新增多少個字元,可以讓這個字串獲得重複迴圈序列。輸入 第一行是乙個整數 t 0 t 100 t 0t 0 t 1 00 代表測試資料的組數。之後t tt行每行乙個字串,由小寫字母組成,字串的長度 3 l 100000 3 l 100000 3 l 1 0000 ...

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 如果不能,說明還需要...