Зеркальные фрагменты в школьной записи

тема: Строки · уровень: продвинутый

Условие

В школьном чате кто‑то написал длинную строку из маленьких латинских букв. Классный руководитель любит «зеркальные» фрагменты: такие подряд идущие кусочки строки, которые читаются одинаково слева направо и справа налево.

Посчитайте, сколько в строке таких зеркальных фрагментов (подстрок). Две подстроки считаются разными, если отличаются позициями в строке (даже если текст одинаковый).

Формат ввода

Формат вывода

Ограничения

Пример Ввод:

ababa

Вывод:

9

Как решать — идея подхода

Приём: Расширение от центра (palindrome expand)

Ключевое наблюдение: любой палиндром однозначно задаётся своим «центром». Центр бывает двух типов: в символе (нечётная длина, например aba) и между соседними символами (чётная длина, например abba). Если для каждого центра попытаться расширять границы влево и вправо, пока символы равны, то каждое успешное расширение даёт новый палиндром, и так мы посчитаем все подстроки по позициям.

Почему это работает: палиндром симметричен, значит проверять всю подстроку не нужно — достаточно сравнивать пары s[l] и s[r], двигая l -= 1, r += 1.

План:

Мини-сниппет условия расширения: while l >= 0 and r < n and s[l] == s[r]: ...

Сложность: в худшем случае O(n^2) сравнений (например, строка из одинаковых букв), при n ≤ 3000 это проходит.

Частая ошибка: забыть про чётные палиндромы (центр между символами) — тогда потеряются варианты вроде aa, abba.

Решить задачу с автопроверкой на Python →

Куда дальше