EduBrick

J. Сколько разбиений на палиндромы

3000 мс · 256 МБ · всё или ничего

Посчитайте количество способов разрезать строку на палиндромы по модулю 109+710^9 + 7. Разбиения различаются набором позиций разрезов.

Схема та же, что в классной задаче про наименьшее число кусков, но вместо минимума - сумма:

ways[j]=∑i<j, pal[i][j−1]ways[i],ways[0]=1ways[j] = \sum_{i < j,\ pal[i][j-1]} ways[i], \qquad ways[0] = 1

Это общее правило: одна и та же динамика с min⁡\min считает оптимум, с суммой - количество. Меняется только операция сборки, а состояния и переходы те же.

Ответ всегда не меньше единицы: разбиение на отдельные буквы существует всегда.

При n=5000n = 5000 ответ огромен - отсюда и модуль. Не забудьте брать остаток на каждом шаге, а не в конце.

Формат ввода

Одна строка длины nn (1≤n≤50001 \le n \le 5000) из строчных латинских букв.

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

Одно число - количество разбиений по модулю 109+710^9 + 7.

Примеры

ввод
aab
вывод
2
ввод
abcde
вывод
1
Войдите, чтобы отправлять решения.