KMP演算法初學next陣列

2021-08-07 10:56:27 字數 1223 閱讀 8603

參考

講解的很詳細

乙個字串的字首是指包含該字元第乙個字母的連續子串,例如:abcd的所有字首為a, ab, abc, abcd。

給出乙個字串s,求其所有字首中,字元長度與出現次數的乘積的最大值。

例如:s = 「abababa」 所有的字首如下:

「a」, 長度與出現次數的乘積 1 * 4 = 4,

「ab」,長度與出現次數的乘積 2 * 3 = 6,

「aba」, 長度與出現次數的乘積 3 * 3 = 9,

「abab」, 長度與出現次數的乘積 4 * 2 = 8,

「ababa」, 長度與出現次數的乘積 5 * 2 = 10,

「ababab」, 長度與出現次數的乘積 6 * 1 = 6,

「abababa」, 長度與出現次數的乘積 7 * 1 = 7.

其中」ababa」出現了2次,二者的乘積為10,是所有字首中最大的。

input

輸入字串s, (1 <= l <= 100000, l為字串的長度),s中的所有字元均為小寫英文本母。

output

輸出所有字首中字元長度與出現次數的乘積的最大值。

input示例

abababa

output示例

10利用next陣列,res[i]為長度為i的出現次數,顯然每個res[i]都要初始化為1。next[i]表示字串[0,i]字首和字尾重複的最長長度,因此可以利用它,然後較長的字首出現一次代表較短的字首出現一次,o(n)遞推掃一下即可。

#include 

#include

#include

using

namespace

std;

const

int maxn = 1e5 + 10;

char str[maxn];

int len;

int nt[maxn];

int res[maxn];

void getnext()

else

}}int main()

long

long ans = 0;

for (long

long i = 1; i <= len; i++)

printf("%lld\n", ans);

return

0;}

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演算法next陣列求解

kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...