KMP以及next陣列應用 POJ1961

2021-07-05 10:31:37 字數 780 閱讀 8080

百萬級字串..無從下手,t到死

從網上查到要用kmp。。我之前也是看過的,欺負我讀書少麼,kmp與這個題有神馬聯絡。

題目分析:該題用到了next陣列,next陣列代表的是"字首"和"字尾"的最長的共有元素的長度(必然小於本身長度),為何用到它可能有些難以理解,慢慢來~

從結果逆推,若乙個字串(len=n)由某個子串(len=x)重複k次得到,則它的next陣列值必然為(k-1)*x,這樣就得到了k = n / (n - next[n]);

事實上,如果某乙個字串(len=n)的next陣列值為x,並且有n整除(n-x),令l=n-x,由字首字尾的對應關係,即可遞推得:

s[(k-1)l+1...kl] =

... =  s[2l+1...3l] = s[l+1...2l] = s[1...l]

#include#include#includeusing namespace std;

char a[1000005];

int next[1000005];//從0開始

void makenext(const char p,int next)

next[q] = k;

}}int kmp(const char t,const char p,int next)

if (q == m)

}

}int main()

else{

cin>>a;

cout<

{cout<

參考: 

KMP演算法 next陣列

通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的 1 void makenext const char p,int next 214 next q k 15 16 現在我著重講...

KMP演算法 NEXT陣列

kmp和next陣列基本上是一起用的,有了next陣列,才有kmp演算法,講道理來說這兩個都是基於最大前字尾和,也就是說需要用到kmp的時候必須先把next陣列先求出來,next陣列就是由所匹配的word的每個子串的前字尾和最大匹配得到的,說實話next陣列的演算法給優化得已經很無解了,以至於至今我...

幫你理解KMP演算法以及怎麼求next陣列

kmp演算法做的事情就是用來進行字串匹配,並且盡量高效地去移動模式串,避免不必要的匹配。在字串a中找尋是否存在部分等於字串b,在這裡我們把b看做模式串,去跟字串a做匹配 這個匹配的規則是這樣的,對於模式串b的某一位出現了失配的情況,那麼如果前面存在最長k位的部分匹配,就將模式串向後移到讓模式串的k ...