AcWing 141 週期(kmp求迴圈節)

2021-09-29 04:46:46 字數 1042 閱讀 7419

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

我們希望知道乙個n位字串s的字首是否具有迴圈節。

換言之,對於每乙個從頭開始的長度為 i (i>1)的字首,是否由重複出現的子串a組成,即 aaa…a (a重複出現k次,k>1)。

如果存在,請找出最短的迴圈節對應的k值(也就是這個字首串的所有可能重複節中,最大的k值)。

輸入格式

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

第一行輸入字串s的長度n。

第二行輸入字串s。

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

輸出格式

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

接下來的每一行,輸出具有迴圈節的字首的長度i和其對應k,中間用乙個空格隔開。

字首長度需要公升序排列。

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

資料範圍

2≤n≤1000000

輸入樣例:

3aaa

4abcd

12aabaabaabaab

0輸出樣例:

test case #1

2 23 3

test case #2

test case #3

2 26 2

9 312 4

題意:輸入乙個字串,輸出以i為結尾的字串有幾個最長迴圈節,1不用輸出。

由於kmp的性質,i-next[i]就是最長迴圈節的長度,只要能整除就是存在。

using

namespace std;

const

int n=

1000010

;char str[n]

;int n,next[n]

;void

get_next()

}int

main()

puts

(「」);}

return0;

}

習題3 4 週期串

如果乙個字串可以由某個長度為k的字串重複多次得到,我們說該串以k為週期。例如,abcabcabcabc以3為週期 注意,它也以6和12為週期 輸入乙個長度不超過80的串,輸出它的最小週期。樣例輸入 hohoho 樣例輸出 2 include include 列舉法 intmain if ok 找到週...

第二週期總結

算數運算子 求餘 3 2 1 7 4 3 數字帶有負號 7 4 3 7 4 3 2.遞增和遞減 遞增1 遞減1 i 和 i 運算順序 放前面要先運算 再取a的值 放後面 先取a的值在運算 3.邏輯運算子 邏輯與 短路與 a b 並列關係 兩個都返回true 才返回true 如果a為false 則b表...

16周 期末總結

時光荏苒,不知不覺已經過去了乙個學期。這乙個學期,真的非常感謝賀老師,賀老師讓我們接觸到了新的學習方式 翻轉課堂,在這樣的教學方式下,我們對資料結構進行了一次有趣的學習之旅。現在依稀還能記得第一堂課的樣子,那是第一次接觸翻轉課堂,賀老師在講台上面給我們講怎麼來實現翻轉課堂,其實當時還是一頭霧水,但是...