Ctrl K

Пересадка к своей букве

Средняя
Дано дерево из n вершин с номерами от 0 до n - 1 и корнем в вершине 0. Оно задано массивом parent: parent[i] — родитель вершины i, а parent[0] = -1. Кроме того, у каждой вершины есть буква: labels[i]. Все вершины, кроме корня, одновременно пересаживаются: вершина x ищет среди своих предков (в исходном дереве) ближайшего с той же буквой, что у неё самой. Если такой предок найден, x вместе со всем своим поддеревом становится его ребёнком; если нет — остаётся на месте. Верните массив, где i-й элемент — число вершин в поддереве вершины i в получившемся дереве (включая саму i).
Пример 1
parent=[-1, 0, 1, 2], labels="abab" → [4, 2, 1, 1]

Вершина 2 (буква a) переезжает к ближайшему предку с той же буквой — к корню 0. Вершина 3 (буква b) переезжает к вершине 1. Теперь у корня дети 1 и 2, у вершины 1 — ребёнок 3.

Пример 2
parent=[-1, 0, 0], labels="xyz" → [3, 1, 1]

Все буквы разные, никто никуда не переезжает.

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

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