У Азизхана есть строка S. Его интересует сколько есть подстрок четной длины у строки S,...

0 голосов
32 просмотров

У Азизхана есть строка S. Его интересует сколько есть подстрок четной длины у строки S, которые являются палиндромами. Одинаковые подстроки начинающие с разных позиций считаются разными.
Формат входных данных
Единственная строка входного файла содержит одну строку S состоящее из строчных букв английского алфавита (1 <= длина S <= 100000).<br> Формат выходных данных
Выведите ответ к задаче.
Помагите плиз


Информатика (15 баллов) | 32 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

Наивный алгоритм: используя два вложенных цикла, проверить все подстроки, являются ли они палиндромами. Такой алгоритм будет работать O(|S|^2), что при ограничении |S| <= 10^5 потребует примерно 10^10 / 2 сравнений, что достаточно долго.<br>
Оптимизация: в центре у палиндрома четной длины всегда пара одинаковых символов. Их можно найти, а затем увеличивать длину до тех пор, пока это возможно. Плюс этого наблюдения в том, что если пара попадется не в центре, то максимальная длина подстроки-палиндрома с центром в этой паре, будет ограничена сверху. Однако в худшем случае (все символы одинаковы) всё равно придется произвести немалое число сравнений.

Однако задачу можно решить и за линейное время. Например, существует алгоритм Манакера, основанный на том, что можно использовать информацию, что часть строки является палиндромом. А именно, если в длинную-длинную строку-палиндром входит другая подстрока-палиндром, то можно не начинать проверку заново, а использовать уже имеющуюся информацию.

Пример 1: "длинная" подстрока-палиндром:
cbbaabbaabbc
в которой известна подстрока-палиндром. Тогда в строке есть симметричная подстрока-палиндром:
cbbaabbaabbc
Пример 2: "длинная" подстрока палиндром:
bbaabbaabbaa
Зная, что в ней есть подстрока-палиндром
bbaabbaabbaa,
можно явные сравнения для подстроки с центром в
bbaabbaabbaa
начинать уже с 
bbaabbaabbaa

Если не хочется писать самостоятельно, алгоритм Манакера легко находится.

(148k баллов)