Ctrl K

Пути-палиндромы в дереве

Сложная
Сеть туристических тропинок образует дерево из n развилок с номерами от 0 до n - 1; развилка 0 — корень. Массив parents задаёт дерево: parents[i] — родитель развилки i, а parents[0] = -1. Каждая тропинка помечена буквой: labels[i] — буква на тропинке между i и parents[i]. Символ labels[0] ничего не значит. Строка labels может быть длиннее n — лишние буквы в конце ни к одной тропинке не относятся. Посчитайте пары развилок (u, v) с u < v, для которых буквы на пути от u до v можно переставить так, чтобы получился палиндром (строка, которая читается одинаково в обе стороны).
Пример 1
parents=[-1, 0, 0, 1], labels='xabb' → 4

Подходят пары (0, 1) — «a», (0, 2) — «b», (1, 3) — «b» и (2, 3) — путь 2 → 0 → 1 → 3 даёт «bab». Пути (0, 3) и (1, 2) дают «ab», из него палиндром не собрать.

Пример 2
parents=[-1, 0, 1], labels='zcd' → 2

Буква корня labels[0] ни на что не влияет. Пары соседних узлов дают по одной букве, а путь от 0 до 2 даёт «cd».

Пример 3
parents=[-1], labels='q' → 0
Ограничения
  • n = len(parents) ≤ len(labels)
  • 1 ≤ n ≤ 10⁵, len(labels) ≤ 10⁵
  • parents[0] = -1, а при i ≥ 1: 0 ≤ parents[i] ≤ n - 1
  • parents задаёт корректное дерево
  • labels состоит из строчных латинских букв
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиСтоянки по размаху СложнаяСбор монет: пошлина или половина СложнаяДрель и сейфы СредняяСамый тяжёлый путь в дереве СложнаяКак рассчитаться за меньше переводов Сложная
загружаем Python…
Вход
parents=[-1, 0, 0, 1], labels='xabb'
Ожидается
4

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 52 теста на сервере, включая скрытые.