Z-функция: различия между версиями

Материал из Олимпиадное программирование в УлГТУ
Перейти к навигации Перейти к поиску
Нет описания правки
 
Строка 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-функция]

Текущая версия от 23:31, 13 сентября 2020

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;
}

Ссылки