$\newcommand{\O}{\mathrm{O}}$
文字列 $S$ が与えられたときに $0 \le i < n$ について $S[0:i]$ の接頭辞と接尾辞が最大何文字一致しているかを表す配列 $res[i]$ を線形時間で構築するアルゴリズム(ただし $res[i] \le i$ とする).
時間計算量: $\O (|S|)$
void MP(const string& S, vector<int>& res){ int n = (int)S.size(), j = 0; res.resize(n, 0); for(int i = 0; i < n-1; i++){ while(S[i+1] != S[j] && --j >= 0) j = res[j]; res[i+1] = ++j; } }