KMP演算法中的迴圈節問題

2021-08-22 16:25:59 字數 1503 閱讀 2339

迴圈節問題包括 完全迴圈 和 不完全迴圈

對於乙個具有迴圈節並且長為n的字串,其迴圈節長為 n - n x t [ n - 1 ] ,並且滿足n % ( n - n x t [ n - 1 ] ) ==0 , 這裡nxt [ ]是kmp演算法中的next 陣列,並且是對於本部落格上上上篇給出的kmp模板的方法構造nxt陣列來說的。

本篇部落格kmp演算法的講解在這裡:kmp板子

(不同的構造方法可能式子不一樣,比如有的方法下可能是 n - n x t [ n ] )

不完全迴圈是說需要補上一些位才能構成完整的迴圈,比如abca,就可以稱為乙個不完全迴圈,需要補上bc才能構成乙個完整的迴圈。而完全迴圈則是類似abcabc這樣的。設字串長度為 len ,那迴圈節長度就是 len-nxt [len-1],需要補全的位數就是迴圈節長度-nxt [ len-1 ]%迴圈節長度。

其實寫出乙個字串模擬一下就能感覺到。

比如給出字串:abcdabcdabcd,長度為12,而我們 nxt [ 12-1 ] = nxt [ 11 ] = 8,根據這個nxt陣列的定義,它表示的是這個字串字首和字尾相等的最大長度,如果是完全迴圈,那麼剩下的也就是 len-nxt [ 11 ]當然就是最大的迴圈節長度了。

如果把字串改為:abcdefabc,我們可以知道,迴圈節算的方法跟完全迴圈的一樣,就是len - nxt [ len-1 ]=l,即abcdef,那麼 nxt [ len-1 ] 就是最後剩下的一串字元,它可能大於迴圈節也可能小於迴圈節(大於迴圈節的時候:len - nxt [ len-1 ] < nxt [ len-1 ],即 2 * nxt [ len-1 ] > len,比如azaza的情況)因此我們要用nxt [len-1] %迴圈節長度表示剩下的,而需要補全的當然就是迴圈節長度減去這個值啦。

下面是例題:

hdu - 1358

**:#include#include#include#define maxn 1000005

using namespace std;

char s[maxn];

int nxt[maxn];

int n;

void build()//構造nxt表

{ int k=0;

nxt[0]=0;

for(int i=1;ihdu - 3746 

**:#include#include#include#define maxn 100005

using namespace std;

char s[maxn];

int nxt[maxn];

int n;

void build()

{ int k=0;

nxt[0]=0;

for(int i=1;i-------------------------這樣以後--------------------------------基本上都是-------------------------------------板子------------------------------------了

呼呼

KMP 迴圈節問題

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

KMP演算法 next陣列的應用 迴圈節問題

先來個next陣列模板 void next int i 0,j 1 next 0 1 while i 1 i next i 是最小迴圈節的長度 2 字串的迴圈條件是i i next i 0 next i 0 3 最小迴圈節的迴圈次數是i i next i 4 整體 在 字串 s l strlen s...

最短迴圈節 KMP 實現

假設字串str的長度為len,則str存在最小迴圈節,迴圈節的長度cyclelen為len next len 迴圈子串為str 0 len next len 1 如果len可以被len next len 整除,則表明字串str可以完全由迴圈節迴圈組成 如果不能,說明還需要再新增幾個字母才能補全,需要...