Поиск подстроки в строке – одна из классических задач алгоритмики, имеющая важное значение в программировании, текстовой обработке, биоинформатике, криптографии и других областях. В школьном курсе информатики она встречается в задачах, связанных с обработкой строк, анализом последовательностей символов и поиском закономерностей. Алгоритм Рабина–Карпа является одним из наиболее известных методов поиска подстроки, основанным на использовании хэш-функций и метода «скользящего окна».
В контексте подготовки к ЕГЭ по информатике знание этого алгоритма позволяет учащимся глубже понять принципы работы со строками, закрепить понимание понятий алгоритмической сложности, хэширования, алгоритмических оптимизаций, а также развить навыки решения задач с использованием современных методов обработки данных.
Суть метода
Алгоритм Рабина–Карпа решает задачу: найти все вхождения строки P (шаблона) длиной m в строку T (текст) длиной n, где n≥m.
Основная идея:
Для каждой подстроки текста длины mmm вычисляется хэш-значение.
Для шаблона P также вычисляется хэш.
Если хэши совпадают, то выполняется дополнительная проверка (сравнение символов).
Сдвигая «окно» по строке, мы быстро пересчитываем хэш благодаря рекуррентным формулам.

В среднем: O (n+m) – благодаря эффективному пересчёту хэшей.
В худшем случае: O (n⋅m), если часто случаются коллизии (разные строки имеют одинаковый хэш).
Выбор модуля p: следует использовать достаточно большое простое число, чтобы минимизировать вероятность коллизий.
Выбор основания q: обычно выбирается число, большее размера алфавита (например, для латинских букв q=31 или q=53).
Обработка коллизий: совпадение хэшей не гарантирует равенства строк – нужна дополнительная проверка символов.
Оптимизация: при решении школьных задач можно использовать простое целочисленное хэширование без модуля, если строка короткая и вероятность переполнения мала.
Корректность: алгоритм всегда должен выдавать точный результат при наличии проверки совпадений символов.

В ЕГЭ часто встречаются задачи на:
подсчёт числа вхождений подстроки в строку;
поиск первой позиции подстроки;
определение свойств строки (например, палиндромичность, повторяемость фрагментов).
Хотя алгоритм Рабина–Карпа прямо не включён в обязательную программу, его идеи можно использовать при решении сложных задач. Например, для строк длиной в десятки тысяч символов использование прямого сравнения всех подстрок становится неэффективным, а метод хэширования даёт возможность ускорить поиск.
Упражнение 1.
Реализуйте алгоритм Рабина–Карпа для поиска всех вхождений подстроки «aba» в строку «abacabaaba». Выпишите промежуточные хэши каждого окна.
Упражнение 2.
Дана строка длиной n=105. Сравните время работы двух методов: полного перебора и Рабина–Карпа. Подсчитайте, сколько операций символ-символ требуется в худшем и среднем случае.
Упражнение 3.
Напишите программу, которая проверяет, является ли строка T повторением некоторого шаблона PP, используя алгоритм Рабина–Карпа (например, строка «abcabcabc» является повторением «abc»).
Упражнение 4.
Рассмотрите задачу: найти первую позицию подстроки в строке. Реализуйте два варианта:
наивный алгоритм;
алгоритм Рабина–Карпа.
Сравните шаги работы на примере: T=«mississippi», P=«issi».
Упражнение 5.
Для строки длиной 20 символов постройте таблицу хэш-значений всех подстрок длины 5. Сравните число коллизий при использовании модуля p=101 и при использовании большого простого числа p=109+7. Сделайте вывод о важности выбора параметров алгоритма.
Алгоритм Рабина–Карпа – пример удачного применения математических идей (хэширования, модульной арифметики) в информатике. Его использование демонстрирует учащимся, что даже классическая задача поиска подстроки может быть решена разными способами: наивным и оптимизированным.
Для подготовки к ЕГЭ понимание данного метода не только расширяет кругозор, но и позволяет формировать устойчивые навыки анализа алгоритмов, оценки их сложности, работы с понятием коллизий и обработки больших объёмов данных. А выполненные упражнения развивают практические умения программирования, необходимые как для экзамена, так и для будущей профессиональной деятельности.