總時間限制: 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的長度...