字串kmp exkmp 馬拉車(刷題總結)

2022-08-02 10:42:07 字數 869 閱讀 1748

1、kmp

1.1、kmp演算法需先對模式串建立fail陣列,陣列所包含的資訊就是比如fail[i]表示字首s[1...i]的最大border長度。

若 0 ≤ r < |s|, pre(s, r) = suf(s, r), 就稱 pre(s, r) 是 s 的 border。 

也就是當匹配完第i個字元後,假設我們已經到了模式串的第match位,如果s[match+1]!=p[i+1],則match=fail[match],轉成最大border,使模式串能更快的與匹配串對齊。

利用kmp匹配失敗後又再次對齊,就可以解決查詢乙個串在另乙個串中的出現次數(考慮或不考慮重疊)。

1.2、len-fail[len-1]即串中迴圈節的長度。

1.3、可以做一些和字首有關的dp,dp[i]=dp[ fail[i] ]+1.

2、最小最大表示法

即求在乙個字串的迴圈同構體中,哪乙個字典序最小/大。

3、stl string

時間複雜度似乎大一點點,但對於暴力是個不錯的選擇。

4、exkmp

o(n)求乙個字串的所有字尾與另乙個字串的最長公共字首。

5、manacher

需先預處理成偶數形式(每隔兩個字元乙個『#』),令p[i]表示以i為對稱中心的回文串的半徑,線性掃瞄處理。

好吧舉個例子

aaaabaaaa

假設我們求到了上面那個琥珀色的a,因為我們已經求過b了,所以可知

aaaabaaaa

左右兩個是對稱的,所以右邊琥珀色的a就可以繼承左邊琥珀色的a的長度,當然也有限制

len=mx>i?min(p[2*id-i],mx-i):1; ,mx為記錄的最大右端點值,即b的右端點。

改一改就可以解決凹凸型回文子串問題。

字串演算法 馬拉車演算法

參考部落格 時間複雜度o n o n o n 可以求出乙個串中最長回文子串長度,回文子串個數,每個位置的最長回文子串長度。char str 輸入的字串。char tmp 預處理過後的字串。int mx 當前最長回文子串匹配的最右位置。int po 當前最長回文子串的中點位置。int len i 最長...

字串 馬拉車演算法(求最長回文串)

作為乙個字串渣渣,對於我來說,看見此類問題總會忍不住虎軀一震。初次見到 求最長回文串 問題時,我腦子裡無非蹦出兩個想法 1.用棧的結構來儲存,然後出棧看是否滿足回文串的條件 回文串定義相信大家都知道,在此就不囉嗦了 2.看見最長,立馬想到用動態規劃的思想,寫出狀態轉移方程,找出最優子結構。其實這兩個...

Manacher演算法 馬拉車(麻雀) 字串回文

這個演算法。和原先學習的kmp都是處理字串的。只不過麻雀是專門針對回文串的。我是最近cf補題的時候碰到這個演算法的。特此記錄一下。說實話。原先學資料結構的時候學的kmp。現在應該完全忘光了把。啊哈哈。明天再補補。舉個例子 回文串分為奇回文和偶回文。奇回文的中心是中間的字元。偶回文的中心是兩個字元中間...