Z-функция: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) (→Ссылки) |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 1: | Строка 1: | ||
Z-функция строки s — массив длин максимальных подстрок, совпадающих с началом всей строки, для каждого индекса i. | |||
vector<int> zFunction(const string &s) { | |||
vector<int> z(s.size()); | |||
int blockL = 0, blockR = 0; | |||
for (int i = 1; i < s.size(); i++) { | |||
int blockLen = 0; | |||
if (i <= blockR) | |||
blockLen = min(z[i - blockL], blockR - i + 1); | |||
while (i + blockLen < s.size() && s[i + blockLen] == s[blockLen]) | |||
blockLen++; | |||
z[i] = blockLen; | |||
if (blockR < i + blockLen - 1) { | |||
blockL = i; | |||
blockR = i + blockLen - 1; | |||
} | |||
} | |||
return z; | |||
} | |||
== Ссылки == | == Ссылки == | ||
* [https://codeforces.com/edu/course/2/lesson/3 Codeforces EDU — Z-функция] | * [https://codeforces.com/edu/course/2/lesson/3 Codeforces EDU — Z-функция] |
Текущая версия от 11:26, 25 октября 2024
Z-функция строки s — массив длин максимальных подстрок, совпадающих с началом всей строки, для каждого индекса i.
vector<int> zFunction(const string &s) { vector<int> z(s.size()); int blockL = 0, blockR = 0; for (int i = 1; i < s.size(); i++) { int blockLen = 0; if (i <= blockR) blockLen = min(z[i - blockL], blockR - i + 1); while (i + blockLen < s.size() && s[i + blockLen] == s[blockLen]) blockLen++; z[i] = blockLen; if (blockR < i + blockLen - 1) { blockL = i; blockR = i + blockLen - 1; } } return z; }