題意:
給你乙個字串,長度小於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 主串長度 然後再用主串長除以週期子串長度就得到了子串週期長...