https://coderun.yandex.ru/problem/pedigree-counting-levels/description Средняя

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val n = reader.readLine().toInt()
    val tree = mutableMapOf<String, MutableList<String>>() // Дерево родственных связей
    val parentMap = mutableMapOf<String, String>() // Сопоставление потомок -> родитель
    val heights = mutableMapOf<String, Int>() // Высоты вершин
    val hasParent = mutableSetOf<String>() // Запоминаем всех, у кого есть родитель

    repeat(n - 1) {
        val (child, parent) = reader.readLine().split(" ")
        tree.computeIfAbsent(parent) { mutableListOf() }.add(child)
        parentMap[child] = parent
        hasParent.add(child)
        heights[child] = -1 // Отметка, что высота ещё не вычислена
        heights[parent] = -1
    }

    // Находим родоначальника (того, у кого нет родителя)
    val root = heights.keys.find { it !in hasParent } ?: return
    heights[root] = 0

    // Функция для вычисления высоты элемента через рекурсию с мемоизацией
    fun getHeight(name: String): Int {
        if (heights[name] != -1) return heights[name]!! // Если уже вычислено, просто возвращаем
        val parent = parentMap[name] ?: return 0
        val height = getHeight(parent) + 1
        heights[name] = height
        return height
    }

    // Вычисляем высоты всех узлов
    for (name in heights.keys) {
        getHeight(name)
    }

    // Выводим имена в лексикографическом порядке
    for (name in heights.keys.sorted()) {
        writer.write("$name ${heights[name]}\\n")
    }

    reader.close()
    writer.flush()
    writer.close()
}