POJ2406 KMP字首週期

2021-06-22 07:37:45 字數 644 閱讀 2993

題意:

給你乙個字串,長度小於1百萬,問你他最多可以拆成集合相同字串,例如abcabcabc 可以拆成3個abc,所以輸出3.

思路:這個是比較常規的next應用,首先假設當前字串長度n;那麼

n - next[n]字首為最短子串長度,如果n - next[n] != 0 && n / (n - next[n]) == 0,說明最後乙個字串是長度(n - next[n])子串的最後一位,那麼直接輸出n/(n-next[n])就行了,否則不是最後一位,輸出1 ,例如abcab 最後n - next[n]應該等於3,說明最短子串是3,而5 % 3 == 2,說明最後乙個是子串中的第二個,不能做到完全迴圈,所以要輸出1

#include

#include

int next[

1000005

];char str[

1000005

];void

get_next

(int m)

}int

main

()return0;

}

poj2406 kmp,字尾陣列

開始是用字尾陣列做的,rmq果斷超了記憶體,全部改用unsigned short結果又超時,後來參考了 裡的方法。關鍵思想是設k為最小重複字串的長度,則s 0,1 n k 1 s k,k 1 n 1 即lcp rank 0 rank k n k 由於0位置是固定的,只需要對名次迴圈求出最小的k就行!...

poj 字首中的週期

題目 字首中的週期 用nex陣列來表示字串每個字元i的特徵數,即p 0.i 1 中最大的相同字首子串和字尾子串。對於有i個字元的字串p,有迴圈節的充分必要條件應該是i i nex i 1 0,並且迴圈節的個數為i i nex i 1 如下 include include include includ...

poj2406 求主串的週期子串

題目大意 給出乙個字串,將其分解為若干子串的和,求可分解的最多子串的個數。做題之前就知道這是一道kmp的題目,但一直沒想到怎麼寫 後面看了下別人的思路 最近寫題總是會忍不住看別人的思路 慚愧。得出結論 乙個串的週期子串長度 主串長 next 主串長度 然後再用主串長除以週期子串長度就得到了子串週期長...