最小迴圈節求法:
定理:假設s的長度為len,則s存在最小迴圈節,迴圈節的長度l為len-next[len],子串為s[0…len-next[len]-1]。
(1)如果len可以被len - next[len]整除,則表明字串s可以完全由迴圈節迴圈組成,迴圈週期t=len/l。
(2)如果不能,說明還需要再新增幾個字母才能補全。需要補的個數是迴圈個數l-len%l=l-(len-l)%l=l-next[len]%l,l=len-next[len]。
推薦一篇文章,裡面有關於next的優化:
**:#include#includeusing namespace std;
int t,next[100009],len;
char a[100009];
void getnext()
{ int i=0;
next[i]=-1;
int j=-1;
while(i
hdu3746(kmp最小迴圈節)
題意 問在乙個字串末尾加上多少個字元能使得這的字串首尾相連後能夠迴圈 題解 就是利用next的性質求最小迴圈節 kmp求最下迴圈節 ans len next len ans就是最小迴圈節長度證明看那個部落格。然後就簡單了。include include include using namespace...
HDU3746 (KMP)字串最小迴圈節問題
傳送門 題意 給你乙個串,要你在串頭或尾新增最少的字元,使得該串至少有2個迴圈節,問你最少需要加幾個字元.如 aaa 迴圈為 a 已有3個迴圈節 abca 迴圈節為abc 至少在末尾加 bc 使得該串至少有2個迴圈節 abcde 迴圈節為abcde 至少在末尾加 abcde 使得該串至少有2個迴圈節...
kmp找最小迴圈節,hdu3746
字串的長度為len 最小迴圈節的長度l len next len 需要補齊的字元個數r l len l 這個題沒啥大的問題,就是輸入很奇怪,如果用cin,getline 會錯,用scanf s s 就對了 include include include include include include...