TGViewer
Поступашки - Информатика Поступашки - Информатика @postupashki_prog · 1.75K subscribers
Post #137 4.33K
Здравствуйте, камрады 😭
Сегодня разбираем строки, а если быть точнее - 🇷🇺-функцию

Определение
Разберем на задаче: пусть дана строка s длины n
Z-функция от этой строки - это массив длины n, i-ый элемент которого равен наибольшему числу символов, начиная с позиции i, совпадающих с первыми символами строки s.
Если по простому, z[i] - это наибольший общий префикс строки s и её i-го суффикса.

Пример подсчитанной Z-функции
s = "aaaaa"
z[0] = 0
z[1] = 4
z[2] = 3
z[3] = 2
z[4] = 1

Реализация на С++
vector<int> z_function(string s) {
int n = s.length();
vector<int> z(n);

// L и R - границы отрезка, где мы уже были
// и знаем, что s[L...R] = s[0...R-L]
int L = 0, R = 0;

for (int i = 1; i < n; i++) {
// Если i находится внутри последнего отрезка [L, R]
if (i <= R) {
// Используем уже посчитанное значение
z[i] = min(R - i + 1, z[i - L]);
}

// Пытаемся увеличить Z-функцию
while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
z[i]++;
}

// Обновляем границы отрезка, если ушли дальше
if (i + z[i] - 1 > R) {
L = i;
R = i + z[i] - 1;
}
}

return z;
}


А где ж применять?

- Поиск подстроки в строке
- Количество различных подстрок в строке
- Сжатие строки
- Поиск палиндромов и других структур

Пример поиска подстроки
vector<int> find_pattern(const string& pattern, const string& text) {
string concat = pattern + "#" + text;
vector<int> z = z_function(concat);
vector<int> matches;

int plen = pattern.length();
for (int i = plen + 1; i < concat.length(); i++) {
if (z[i] == plen) {
matches.push_back(i - plen - 1);
}
}

return matches;
}


@postupashki_prog
More from @postupashki_prog
  1. Sep 30, 2026Здравствуйте, камрады 😎 Сегодня прокачанная версия бинпоиска по ответу — параллельный бин…
  2. Sep 27, 2026Олимпиады по информатике 2026/27: сколько теперь реально стоит диплом Здравствуйте, камрад…
  3. Sep 21, 2026💻 Камрады, а вы знали, что БВИ на программную инженерию можно было получить по экономике?…
  4. Sep 7, 2026Здравствуйте, товарищи😎 Сегодня разбираем один из самых частотных приёмов - бинарный поис…
  5. Jul 7, 2026Появился новый бот со шпаргалками и бесплатными материалами для подготовки к ОГЭ и ЕГЭ 😱…
  6. Jul 6, 2026Convex Hull Trick Сегодня обсудим одну из самых краисвых техник в алгоритмическом программ…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →