模板:拓展kmp(Z函数)
生活随笔
收集整理的這篇文章主要介紹了
模板:拓展kmp(Z函数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
所謂拓展kmp,就是拓展的kmp
(逃)
前言
小清新算法,更像一個trick。
exkmp能夠在線性復雜度內求出字符串所有后綴與字符串本身的lcp。
個人感覺這個東西和kmp關系不大,反而有些像馬拉車的思想。
之前學的東西,現在才想起來寫一個解析。
解析
定義 ziz_izi? 表示字符串的后綴 iii 與開頭的lcp。
考慮在求完 z1...i?1z_{1...i-1}z1...i?1? 的情況下,如何求解 ziz_izi?。
設 pospospos 為滿足 pos+zpospos+z_{pos}pos+zpos? 最大的位置,r=pos+zpos?1r=pos+z_{pos}-1r=pos+zpos??1。
分情況討論:
和馬拉車類似的,當我們暴力計算 ziz_izi? 而產生復雜度時,都必然伴隨著 rrr 的增大,rrr 最多不會超過 nnn,所以均攤總復雜度為 O(n)O(n)O(n)。
代碼
void exkmp(){z[1]=0;int pl=0;for(int i=2;i<=n;i++){if(i>pl+z[pl]-1){while(s[1+z[i]]==s[i+z[i]]) ++z[i];}else{z[i]=min(pl+z[pl]-i,z[i-pl+1]);if(z[i]==pl+z[pl]-i){while(s[1+z[i]]==s[i+z[i]]) ++z[i];} }if(i+z[i]>pl+z[pl]) pl=i;}return; }總結
以上是生活随笔為你收集整理的模板:拓展kmp(Z函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复活节2021年几月几号 2021复活节
- 下一篇: P7516 [省选联考 2021 A/B