kmp演算法鞏固 以poj3461為試驗

2021-06-18 03:27:04 字數 1395 閱讀 4163

本來計畫下一步去搞ac自動機的……忽發現它以kmp為基礎……雖然假期練過,但基本內涵都不太清楚了,都是直接套模板orz……是本次來再補一下(⊙﹏⊙) ,總算把自己的板給寫出來了,真是可喜可賀xd

以下先是kmp的重新理解部分:用parent表示母串,son表示子串

當比較母串和子串時,以abcdefg和bcdf為例

母串: a b  c  d e f g

子串:    b  c  d  f

序號: 0 1 2  3  4

當比較到上面這一步時,可發現son[2]與parent[2]失配。如果是樸素演算法,接下來會把子串右移,重新比較,而當比較到第x位時,子串的前x位與對應母串的的前x位相同,所以可以預處理子串的情況,先把子串與子串本身比較,當第x位失配時,子串要右移到第幾位為止,這樣就不需要每次都右移一位,乙個個地試了。把需要右移到第幾位的值儲存在乙個next陣列中。我見過的next陣列求法都不知道幾組了qaq,而且還難理解,果然要自己來寫才行……

以下是今天寫的乙個模板:

//該模板用來找子串在母串中是否存在,若存在,返回起始點,否則,返回-1

const int maxsize=100010;

struct kmp

void insert()

void buildnext()

return ; }

int compare()

else if(soncnt>0)

soncnt=next[soncnt];

else

parentcnt++;

if(soncnt==sonlen)

return parentcnt-soncnt+1;

} return -1;

}}kmp;

然後找了道水題試了一下……稍微改下模板就能過了真是太贊!xd

題號是poj 

#include#includeconst int maxsize=1000010;

struct kmp

void insert()

void buildnext()

return ; }

int compare()

else if(soncnt>0)

soncnt=next[soncnt];

else

parentcnt++;

if(soncnt==sonlen)

ret++;

} return ret;

}}kmp;

int main()

return 0;

}

自從trie後就喜歡上用struct了……看起來比較方便qvq,但是總歸得用class比較好吧……下次再想,明天可準備自動機了=w=

POJ 3461題解(kmp演算法)文字串和子串匹配

poj3461傳送門 特殊的樣例 azaazazaza 輸出 所以next陣列要多一位,0 1 1 2 當模式串比較完之後要指向的是next陣列的最後一位,即開始從第二位字母比較,模擬過程如下 azazaza azazaza aza aza 所以這道題和最基礎的文字串和模式串比較不太一樣,是文字串和...

POJ 3461字串匹配演算法

t組資料,每組資料輸入兩個字串s,c 求s在c 現多少次,輸出次數。這道題是個字串匹配題,可以用kmp演算法來做,也可用字串hash。這兩個演算法的時間複雜度都是線性的。下邊分別介紹兩種演算法。字串hash 在c語言裡每個字元都可以看成乙個數字,範圍是0 127,比如 a 97 所以乙個字串可以看成...

poj 3461 kmp演算法詳細解釋

題目鏈結 kmp演算法已經學過好多次了,但每一次都會忘記,因此打算在這裡藉著這一道模板題記錄下自己對kmp演算法的理解 kmp演算法的核心思想可以理解為 利用目標串自身的資訊,來減少匹配次數提高效率 next陣列的引入 next陣列就是用來幫助利用目標串自身的資訊的。我們這裡定義next陣列表示的是...