KMP總結及拓展

2021-10-06 09:38:24 字數 1783 閱讀 3188

之前集訓的時候曾經自學過kmp,好像就把模板打了就走了,沒有深入理解kmp,今天藉著老師講解,重新加強鞏固了一番,僅以此篇紀念。

宣告:此篇部落格不是教學,僅作為之後複習的資料。

kmp解決的是字串匹配問題,當詢問乙個較短串在乙個較長串**現的次數及位置時,就可以用kmp演算法了。

給定兩個由小寫字母構成的字串 l 和 s 。

請你從左到右,找出子串 l 在母串 s 中每次出現的開始位置(匹配位置)。

#include

using

namespace std;

char s[

1000005

],t[

1000005];

int next[

1000005];

int lens,lent;

void

getnext()

//計算next陣列

}int

main()

}if(f==

0) cout<<

"no"

return0;

}

常數優化

其實沒啥用,還會阻礙kmp的其他用法。但對於某些常熟大的人來說,還是必要的… …

void

getnext()

else k=next[k];}

}

因為nxt

nxtnx

t[ ]陣列維護的是s[1

]s[1]

s[1]

~s [l

en−1

]s[len-1]

s[len−

1](s [l

en

]s[len]

s[len]

)的最長公共前字尾,所以可以解決此類問題。

一道板子:

hdu2596 simpsons』hidden talents

這道題唯一需要動腦子的就是要想到將兩個串拼接在一起。其餘用kmp的get

nxt(

)getnxt()

getnxt

()函式計算就可以了。

#include

using

namespace std;

char s[

100005];

int len,len1,nxt[

100005];

void

getnxt()

}int

main()

for(

int i=

1;i<=nxt[len]

;i++

) cout<; cout<<

" ";

printf

("%d\n"

,nxt[len]);

}return0;

}

又一道板子:

poj2406 power strings

#include

using

namespace std;

int len,nxt[

1000005];

char s[

1000005];

void

getnxt()

}int

main()

return0;

}

詳解見部落格:

撒花完結!!!

拓展kmp演算法總結

演算法總結第二彈,上次總結了下kmp,這次就來拓展kmp吧。拓展kmp是對kmp演算法的擴充套件,它解決如下問題 定義母串s,和字串t,設s的長度為n,t的長度為m,求t與s的每乙個字尾的最長公共字首,也就是說,設extend陣列,extend i 表示t與s i,n 1 的最長公共字首,要求出所有...

拓展kmp演算法總結

演算法總結第二彈,上次總結了下kmp,這次就來拓展kmp吧。拓展kmp是對kmp演算法的擴充套件,它解決如下問題 定義母串s,和字串t,設s的長度為n,t的長度為m,求t與s的每乙個字尾的最長公共字首,也就是說,設extend陣列,extend i 表示t與s i,n 1 的最長公共字首,要求出所有...

總結 字串匹配 KMP 和 拓展KMP

比起ac自動機,kmp就乙個next陣列,理解了如何初始化next後就可以搞一些模板題了,下面是還不錯的學習資料,清晰易懂,自己用的模板也來自它 next 0 1 j 1 for i 0 i for i 0,flag 0,j 0 i 接下來需要更加深入地了解next陣列,許多題目需要用到它的定義來預...