KMP演算法模板

2021-07-26 14:30:12 字數 1102 閱讀 4944

在文字t[1..n]中找到某個模式p[1..m]所有出現的位置被稱作字串匹配問題(m<=n)

p3375 【模板】kmp字串匹配

這道題在洛谷上的評級居然是普及(?!)普及??

qvq

實現起來還是比較簡單的,只不過有很多細節可以有很多種寫法,看別人的**容易凌亂。理解起來比較困難的部分是如何get_next

不建議初學者通過本文學習kmp演算法,我的敘事能力極可能有問題

為了幫助理解程式,畫了兩個圖表示next陣列的預處理過程

另外 1. 該程式中的next[i]表示在p[i+1]匹配失敗後下一次跳轉到的位置

2. 該程式中的字串都從0開始儲存,到length-1

當我們匹配到p[q]==p[k],則有next[q]=k+1

而當匹配到p[q]!=p[k]時…呢?我們把鈷藍色的長方形展開提取到next[k-1],使k=next[k-1]。如果此時p[q]==p[k],則有next[q]=next[k-1]+1;如果仍有p[q]!=p[k],就再將青灰色的長方形展開(k=next[k-1])…直到找到或k=0

#include

#include

#include

#include

using namespace std;

intnext[1005],n,m;

char t[1000005],p[1005];

void get_next()

}void kmp()

}}int main()

後續

呀,寫完這篇忽然發現還是黃學長的寫法比較好orzorzorz我寫的太凌亂了

鏈結:黃學長kmp

我要改寫法。

KMP演算法(模板)

time limit 1000ms memory limit 65536k 有疑問?點這裡 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1 長度小於1000000 第二行代表string2 長...

kmp演算法模板

字串匹配樸素演算法 傳統的字串匹配 效率較低 計算主串中模式串出現的次數 include include using namespace std int index string s,string t else if j lent return count int main kmp演算法 下標從零開...

KMP演算法 模板

include include include include include include using namespace std const int maxn 100005 char t maxn p maxn int lent,lenp int next maxn int h 0 陣列從0開...