Разбор
Построим для строки -функцию и сохраним ее значения в массиве . Выведем значения -функции для всех позиций .
Реализация алгоритма
Входная строка содержит не более символов. -функцию строки сохраняем в векторе .
vector<int> v; string s;
Функция z строит и возвращает -функцию для строки .
vector<int> z(string s) { int i, l, r, len = s.size(); vector<int> z(len, 0); l = 0, r = 0; for (i = 1; i < len; i++) { if (i <= r) z[i] = min(r - i + 1, z[i - l]); while (i + z[i] < len && s[z[i]] == s[i + z[i]]) z[i]++; if (i + z[i] - 1 > r) { l = i; r = i + z[i] - 1; } } return z; }
Основная часть программы. Читаем входную строку .
getline(cin,s);
Вычисляем -функцию.
v = z(s);
Выводим значения -функции для всех позиций входной строки.
for (i = 0; i < v.size(); i++) printf("%d ", v[i]); printf("\n");