Ответ 1
Каждое число принадлежит соответствующему префиксу ("a", "ab", "aba",...) и для каждого префикса представляет длину самого длинного суффикса этой строки, который соответствует префиксу. Здесь мы не считаем всю строку суффиксом или префиксом, она называется само-суффиксом и само-префиксом (по крайней мере, на русском языке, не уверен насчет английских терминов).
Итак, у нас есть строка "ababaca". Давай посмотрим на это. KMP вычисляет функцию префикса для каждого непустого префикса. Давайте определим s[i]
как строку, p[i]
как функцию префикса. префикс и суффикс могут перекрываться.
+---+----------+-------+------------------------+
| i | s[0:i] | p[i] | Matching Prefix/Suffix |
+---+----------+-------+------------------------+
| 0 | a | 0 | |
| 1 | ab | 0 | |
| 2 | aba | 1 | a |
| 3 | abab | 2 | ab |
| 4 | ababa | 3 | aba |
| 5 | ababac | 0 | |
| 6 | ababaca | 1 | a |
| | | | |
+---+----------+-------+------------------------+
Простой C++ код, который вычисляет префиксную функцию строки S:
vector<int> prefixFunction(string s) {
vector<int> p(s.size());
int j = 0;
for (int i = 1; i < (int)s.size(); i++) {
while (j > 0 && s[j] != s[i])
j = p[j-1];
if (s[j] == s[i])
j++;
p[i] = j;
}
return p;
}