擴充套件kmp初學習

2021-09-26 22:40:33 字數 1031 閱讀 5683

參考部落格:

問題定義:給出兩個字串s和t(長度分別是n和m),下標從0開始,定義extend[ i ]表示s[ i ]......s[ n-1 ]與t的最長公共字首的長度,求出所有的extend[ i ],如下表i0

1234

567s

aaaa

abbb

taaa

aacextend[i]54

3210

00如果某個extend[ i ]=m,表示此處有乙個t的匹配,並且首位置為 i ,這樣就可以找到s中所有點t的匹配

輔助陣列next[ i ]:t[ i ].....t[ m-1 ]與t的最長相同的字首

模板:

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

const int mod=100000007;

const int inf=0x3f3f3f3f;

const ll inff=0x3f3f3f3f3f3f3f3f;

const ll n=15;

const ll m=15;

#define mef(x) memset(x,-1,sizeof(x))

#define me0(x) memset(x,0,sizeof(x))

#define mei(x) memset(x,inf,sizeof(x))

void getnext(string st,int len,int net)

while(p=p||i+net[i-a]>=p)

while(p>s>>t)

cout

return 0;}/*

樣例:aaaaabbb

aaaaac

答案:6 4 3 2 1 0

5 4 3 2 1 0 0 0

*/

擴充套件KMP模板(學習)

乙個算是冷門的演算法 在競賽上 不過其演算法思想值得深究。kmp的演算法思想,具體可以參考這篇 trie樹 字典樹 擴充套件kmp的模板問題 給你兩個字串s,t,長度分別為n,m。請輸出s的每乙個字尾與t的最長公共字首。雜湊是不可能的,這輩子都不可能的。mathcalac自動機?好像更不可做了。我們...

擴充套件KMP學習筆記

對於字串 s 定義 z i 為從位置 i 開始的 s 字尾與 s 的最長公共字首的長度。擴充套件 kmp 就是用於在 mathcal o n 複雜度下求解 z 函式的演算法。既然是擴充套件 kmp 那麼當然與 kmp 有一定的關係 這一點主要體現在思想上,兩者都在求解的過程中通過之前已經求解的答案來...

KMP 擴充套件KMP

本文將不斷加入例題,稍安勿躁,今天的總結爭取9 30寫完.kmp,中文名字叫字串匹配,用於解決一類字串匹配問題.先下一些定義 首先我們先想一想 nxt i 對於求解問題有怎樣的幫助.我們對於每乙個 t i s 1 的位置都匹配一次,這樣子複雜度為 theta n m 的.考慮在暴力匹配中其實我們不一...