題目大意:給你乙個長度為 \(n\) 的字串 \(s\) ,那麼它有 \(n\) 個字首。
對於第 \(i\) 個字首 \(t\) ,如果他們表示成乙個子串重複 \(k\) 次 \((k>1)\) ,那麼我們就輸出這個字首 \(t\) 的長度以及對應的最大的 \(k\) 。(因為對於 \(aaaa\) 來說,\(k\) 可以為 \(4\) 或者 \(2\) ,但是 \(4\) 比較大,所以選擇 \(k\) )。
題目分析:考察 \(next\) 函式的應用。我們假設長度為 \(i\) 的字首, \(i-nxt[i]\) 能夠整除 \(i\) ,那麼 \(k=i/(i-nxt[i])\) 。
實現**如下:
#include #include using namespace std;
const int maxn = 1001000;
int m, nxt[maxn], cas = 1;
string t;
char ch[maxn];
string read()
void cal_next()
}int main()
}puts("");
}return 0;
}
HDU 1358 Period KMP計算週期
題目大意 給你一串字串,判斷字串的字首是否由某些字串多次重複而構成。也就是,從第1個字母到第2字母組成的字串可由某一週期性的字串 a 的兩次組成,也就是aa有兩個a組成 第三行自然就是aabaab可有兩個aab組成 第四行aabaabaab可由三個aab組成 第五行aabaabaabaab可由四個a...
HDU1358KMP求迴圈節
直接說結論吧,kmp演算法的前提是預處理乙個next陣列 乙個字串長度為len,那麼這個字串的最小迴圈節就是len nxt len 因此有 判斷乙個字串是否完全迴圈可以用 len len nxt len 0,並且nxt len 0該題中詢問的是在末尾補上幾個字串可以使字串完全迴圈,那麼就用最小迴圈節...
KMP求重複字串 HDU1358
這個題目蠻有意思的,大家都說用到了什麼kmp的靈魂 next陣列的應用,可是也沒見哪個人給我來個很正式的數學推導。到最後也只是看到了乙個部落格上寫的是由觀察得來的結論 其實也就是乙個規律性的東西,就是你利用next陣列以及長度為i的字首可以得出乙個滿足重複的條件 i i next i 0 i i n...