Не могу понять почему эта строка j = pi[j-1];
в префикс-функции дает нам правильную позицию.
Об'ясните пожалуста почему это работает =)
Код с e-maxx.ru:
vector<int> prefix_function (string s) {
int n = (int) s.length();
vector<int> pi (n);
for (int i=1; i<n; ++i) {
int j = pi[i-1];
while (j > 0 && s[i] != s[j])
j = pi[j-1];
if (s[i] == s[j]) ++j;
pi[i] = j;
}
return pi;
}