之前集訓的時候曾經自學過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陣列,許多題目需要用到它的定義來預...