Решение
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 }
}