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。
3abcde
aaaaaa
abababab
164
這道題一看覺得不是特別會,暴力演算法老王的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子串連線構成,那...