Openjudge 字首中的週期

2021-08-09 15:45:05 字數 776 閱讀 3460

運用kmp中的next陣列。

字首中如果有週期的話,一定滿足,next[i] % (i - next[i]) == 0.

滿足這個條件時:

記字串s的第i位之前的子串為p,其字首字串位為p.pre,字尾字串為p.suf,以p(i,j)表示p的從i位到j - 1的字串。則i就是p的長度,next[i] 就是p.pre和p.suf的長度.

首先知道,p.pre(0,i - next[i]) = p(0, i - next[i]),因為這倆就是p的同乙個子串。

又有p.pre = p.suf,所以有,p.pre(0,i - next[i]) = p.suf(0, i - next[i]).

而p.suf(0,i - next[i]) = p(i - next[i],(i - next[i]) * 2) = p.pre(i - next[i], (i - next[i]) * 2);

以此類推,可以發現p是由,p除去p.suf的子串為週期的,週期字串。

#include#includeusing namespace std;

#define maxn 10010000

int* cmput(int *const next, const string &s)

i ++;

j ++;

next[i] = j;

} return next;

}int main()

} cout << endl;

} return 0;

}

poj 字首中的週期

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

字首中的週期 非優化KMP演算法的運用

總時間限制 3000ms 記憶體限制 65536kb 描述 乙個字串的字首是從第乙個字元開始的連續若干個字元,例如 abaab 共有5個字首,分別是a,ab,aba,abaa,abaab。我們希望知道乙個n位字串s的字首是否具有迴圈節。換言之,對於每乙個從頭開始的長度為 i i 大於1 的字首,是否...

POJ2406 KMP字首週期

題意 給你乙個字串,長度小於1百萬,問你他最多可以拆成集合相同字串,例如abcabcabc 可以拆成3個abc,所以輸出3.思路 這個是比較常規的next應用,首先假設當前字串長度n 那麼 n next n 字首為最短子串長度,如果n next n 0 n n next n 0,說明最後乙個字串是長...