kmp演算法模板

2021-09-22 01:35:28 字數 658 閱讀 6687

假設a=「abababaababacb」

b=「ababacb」

用i指標表示a串:a[i-j+1…i]表示a串從

基本思想:i不斷增加,隨著i的增加j相應地變化,且j滿足以a[i]為結尾地長度為j的字串正好匹配b串的前j個字元(j當然越大越好)。然後,檢驗a[i+1]和b[i+1]的關係————

當a[i+1]=b[j+1]時,i和j各加一;什麼時候j=m了,我們就說b是a的子串(b串已經整完了),並且可以根據這時的i值算出匹配的位置。

當a[i+1]不等於b[j+1],kmp的策略是調整j的位置(減小j值),使得a[i-j+1…i]與b[1…j]保持匹配且新的b[j+1]恰好與a[i+1]匹配(從而使得i和j能繼續增加)。

int ans=0,j=0;

for (int i=0;i0&&b[j+1]!=a[i+1]) j=p[j];//不能繼續匹配且j還沒減少到0,減少j的值

if (b[j+1]==a[i+1]) j++; //能繼續匹配,j加1

if (j==m)

} //一句話理解演算法:

掃瞄字串a,並更新可以匹配到b的什麼位置

void pre()

} //要點:1、b串的自我匹配;

// 2、計算匹配的長度

KMP演算法(模板)

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

KMP演算法模板

在文字t 1.n 中找到某個模式p 1.m 所有出現的位置被稱作字串匹配問題 m n p3375 模板 kmp字串匹配 這道題在洛谷上的評級居然是普及 普及?qvq 實現起來還是比較簡單的,只不過有很多細節可以有很多種寫法,看別人的 容易凌亂。理解起來比較困難的部分是如何get next 不建議初學...

kmp演算法模板

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