運用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,說明最後乙個字串是長...