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

2021-07-31 09:35:19 字數 1274 閱讀 9773

總時間限制: 3000ms 記憶體限制: 65536kb

描述 乙個字串的字首是從第乙個字元開始的連續若干個字元,例如」abaab」共有5個字首,分別是a, ab, aba, abaa, abaab。

我們希望知道乙個n位字串s的字首是否具有迴圈節。換言之,對於每乙個從頭開始的長度為 i (i 大於1)的字首,是否由重複出現的子串a組成,即 aaa…a (a重複出現k次,k 大於 1)。如果存在,請找出最短的迴圈節對應的k值(也就是這個字首串的所有可能重複節中,最大的k值)。

輸入 輸入包括多組測試資料。每組測試資料報括兩行。

第一行包括字串s的長度n(2 <= n <= 1 000 000)。

第二行包括字串s。

輸入資料以只包括乙個0的行作為結尾。

輸出 對於每組測試資料,第一行輸出 「test case #「 和測試資料的編號。

接下來的每一行,輸出字首長度i和重複測數k,中間用乙個空格隔開。字首長度需要公升序排列。

在每組測試資料的最後輸出乙個空行。

樣例輸入

3 aaa

12 aabaabaabaab

0樣例輸出

test case #1

2 2

3 3test case #2

2 2

6 2

9 3

12 4

思路:

運用kmp演算法中的next

(1) 判斷是否迴圈: k*2>j

(2) 迴圈節的長度 = j-k, 看j是否是(j-k)的整數倍

int kval[10001010];//kval用來儲存next陣列

int j, k;

int n=1;

int main()

j++; k++;

kval[j]=k;

// j-k 為迴圈節的長度; j%(j-k)==0表明字首長度是迴圈節長度的整數倍

// k是字首j中,最長相等的首尾綴的長度,k必須大於j的一半,才說明是迴圈的

if (j%(j-k)==0 && k*2>=j) cout

0;}

kmp演算法的優化

我們新設定了乙個nextval陣列,nextval j 表示優化後的在j失配,它應該退回的位置。我們原來求解j回退位置k時,其實還是存在無用功。如果p j p k 而我們在j位置發生了失配,j回退到k的位置,結果它的字元和j一樣,那就無意義啊,因為它肯定還是會失配的,只有不一樣的時候,才有可能匹配成...

poj 字首中的週期

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

Openjudge 字首中的週期

運用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的長度...