https://coderun.yandex.ru/problem/autocomplete Сложная

Решение

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

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))
    val n = reader.readLine().toInt()
    val words = reader.readLine().split(" ")
    
    // Храним уникальные слова, уже введённые ранее.
    val seen = HashSet<String>()
    // Корень бор-структуры
    val trie = TrieNode()
    var totalKeyPresses: Long = 0

    for (word in words) {
        if (!seen.contains(word)) {
            // Если слово новое — приходится вводить его полностью.
            totalKeyPresses += word.length
            seen.add(word)
            // Вставляем слово в бор, обновляя счётчики на префиксах.
            var cur = trie
            for (ch in word) {
                val index = ch - 'a'
                if (cur.children[index] == null) {
                    cur.children[index] = TrieNode()
                }
                cur = cur.children[index]!!
                cur.count++
            }
        } else {
            // Слово уже встречалось, пробуем воспользоваться автодополнением.
            var cur = trie
            var keyPressesForWord = word.length  // по умолчанию — придется ввести полностью
            for (i in word.indices) {
                val index = word[i] - 'a'
                cur = cur.children[index]!!
                // Если для данного префикса в боре встречается ровно одно слово,
                // то автодополнение сработает, если предложенное слово совпадает с нужным.
                if (cur.count == 1) {
                    keyPressesForWord = i + 1
                    break
                }
            }
            totalKeyPresses += keyPressesForWord
        }
    }
    
    writer.write(totalKeyPresses.toString())
    writer.newLine()
    writer.flush()
    reader.close()
    writer.close()
}

class TrieNode {
    var count: Int = 0
    val children: Array<TrieNode?> = Array(26) { null }
}