KMP演算法及應用

2022-08-20 18:12:09 字數 1115 閱讀 1870

kmp演算法用來解決一系列字串單模式匹配問題,其以難理解,難記憶著稱。其next陣列的構造就如同ac自動機中的fail指標,就是如果匹配失敗,字串應從**開始繼續匹配。這裡的next陣列表示:next[i]=前i個字元的公共最長前字尾長度。覺得對於kmp演算法,這篇寫的不錯——

現在來講一下應用。

給定兩個字串a和b,我們可以定義一些操作:a*b為將字串a和字串b連線起來,比如a= "aoe",b= "jkw",那麼a*b= "aoejkw"。進一步,我們可以有指數操作,a^0= "", a^1=a, a^2=a*a, a^n=a*(a^(n-1))=a*a*…*a (n個a)

現在給你乙個字串,你可以將它看成是a^n的形式,比如字串"abababab",可以認為是"abab"^2, 也可以是"abababab"^1,還可以是"ab"^4。

現在問題是,給定的字串,我們想讓它變成a^n中的n達到最大,那麼這個n最大是多少?例如:"abababab"最大的n是4。

第一行,乙個整數m,表示有m個字串。

接下來m行每行輸入乙個只含小寫字母的字串。

輸出m行,對於每行輸出相應字串的最大n。

3

abcde

aaaaaa

abababab

1

64

這道題一看覺得不是特別會,暴力演算法老王的blog講了,正解就是運用了kmp演算法裡的next陣列。我們令原字串長度為s,重複字串長度為t,則s=k*t,由定義可知next[s]=(k-1)*t;所以s-next[s]=t,判斷一下整除就好了

#include#include

#include

#include

using

namespace

std;

char str[1000005

];int next[1000005

];void

make_next()

if(str[k]==str[q])

k++;

next[q]=k;

}}void

debug()

void

work()

intmain()

}

java演算法篇KMP演算法及應用

給定兩個字串,判斷是否乙個字串包含另外乙個字串,如果包含,返回起始位置。比如 string str1 abceacmk32acmzq string str2 acm 可以看出,str1包含兩處str2,下面紅色地方 abceacmk32acmzq 返回4和10.遍歷str1,先匹配第乙個,如果不相同...

KMP演算法詳解及各種應用

kmp演算法詳解 kmp演算法之所以叫做kmp演算法是因為這個演算法是由三個人共同提出來的,就取三個人名字的首字母作為該演算法的名字。其實kmp演算法與bf演算法的區別就在於kmp演算法巧妙的消除了指標i的回溯問題,只需確定下次匹配j的位置即可,使得問題的複雜度由o mn 下降到o m n 在kmp...

KMP演算法模板及各種應用

給定乙個字串,問最多是多少個相同子串不重疊連線構成。kmp的next陣列應用。這裡主要是如何判斷是否有這樣的子串,和子串的個數。若為abababa,顯然除其本身外,沒有子串滿足條件。而分析其next陣列,next 7 5,next 5 3,next 3 1,即str 2.7 可由ba子串連線構成,那...