Ctrl K

Палиндромные поддеревья

Сложная
Дано дерево из n узлов с номерами от 0 до n - 1, корень — узел 0. Оно задано массивом parent: parent[i] — родитель узла i, а parent[0] = -1. На каждом узле написана буква: у узла i это labels[i]. *Прочитать* поддерево узла v — значит выписать подряд прочтения поддеревьев всех детей v в порядке возрастания их номеров, а в самом конце дописать букву самого v. Верните массив n логических значений: i-й равен True, если прочтение поддерева узла i — палиндром, и False иначе. Прочитать каждое поддерево отдельно слишком долго для больших деревьев — придумайте способ быстрее.
Пример 1
parent=[-1, 0, 1, 1], labels="zaac" → [False, True, True, True]

Узел 1 читается как a (узел 2), c (узел 3), a (сам) — aca, палиндром. Корень даёт acaz — не палиндром. Листья 2 и 3 — по одной букве.

Пример 2
parent=[-1, 0, 0], labels="aba" → [False, True, True]

Корень читается как b, a, затем свой a — baa, не палиндром.

Пример 3
parent=[-1, 2, 0, 2], labels="cqcq" → [False, True, False, True]
Ограничения
  • 1 ≤ n ≤ 10⁵
  • len(parent) == len(labels) == n
  • parent[0] == -1, а при i ≥ 1: 0 ≤ parent[i] ≤ n - 1
  • parent задаёт корректное дерево
  • labels состоит из строчных латинских букв
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиНаименьшая общая территория СредняяПересадка к своей букве СредняяСемейства слов на один обмен СложнаяЧистка папок-близнецов СложнаяПуть в дереве без одинаковых соседей Сложная
загружаем Python…
Вход
parent=[-1, 0, 1, 1], labels="zaac"
Ожидается
[False, True, True, True]

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