https://coderun.yandex.ru/problem/ivan-and-opensource/description Средняя

Условие

В ходе решения рабочей задачи программист Иван написал библиотеку, которая показалась ему полезной и для сообщества. Обсудив детали с руководителем и получив согласие, он решил выложить её в opensource. Но рабочий репозиторий содержит файлы, описывающие внутреннюю кухню, а их, как известно, нельзя выкладывать за пределы монорепозитория компании.

Иван убедился, что на работу библиотеки эти файлы никак не влияют. Поэтому Иван решил автоматически удалить их из библиотеки. У него есть список файлов, относящихся к библиотеке, а также чёрный список, содержащий пути ко внутренним файлам репозитория. Далее Иван собирается удалить все файлы библиотеки, которые находятся в директориях из чёрного списка.

Вам же необходимо написать программу, которая соберёт статистику по удалённым файлам из директорий.

Примеры

Ввод: 2 /project/internal/ /project/docs/ 5 /project/docs/internal.md /project/lib/header.cpp /project/lib/header.h /project/bin/main.cpp /project/internal/secret.h 3 / /project/internal/ /project/lib/ Вывод: 2 .md: 1 .h: 1 1 .h: 1 0

Ввод: 2 /lib/folder_1/ /lib/folder_2/folder_3/ 7 /lib/a.cpp /lib/folder_2/b.cpp /lib/folder_1/c.cpp /lib/folder_2/folder_4/d.cpp /lib/folder_1/folder_5/e.cpp /lib/folder_2/folder_3/folder_6/f.py /lib/folder_2/folder_3/g.cpp 3 /lib/ /lib/folder_1/ /lib/folder_2/ Вывод: 2 .cpp: 3 .py: 1 1 .cpp: 2 2 .py: 1 .cpp: 1

Решение

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

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

    // Читаем чёрный список
    val n = reader.readLine().toInt()
    val blacklist = Array(n) { reader.readLine() }

    // Читаем файлы библиотеки
    val m = reader.readLine().toInt()
    val files = Array(m) { reader.readLine() }

    // Читаем запросы
    val q = reader.readLine().toInt()
    val queries = Array(q) { reader.readLine() }

    // Определяем удалённые файлы
    val deletedFiles = mutableListOf<Pair<String, String>>() // Путь и расширение
    for (file in files) {
        for (blackDir in blacklist) {
            if (file.startsWith(blackDir)) {
                val ext = file.substring(file.lastIndexOf("."))
                deletedFiles.add(Pair(file, ext))
                break
            }
        }
    }

    // Обрабатываем запросы
    for (queryDir in queries) {
        val extCount = mutableMapOf<String, Int>()
        for ((file, ext) in deletedFiles) {
            if (file.startsWith(queryDir)) {
                extCount[ext] = extCount.getOrDefault(ext, 0) + 1
            }
        }

        // Выводим результат
        writer.write("${extCount.size}\\n")
        for ((ext, count) in extCount) {
            writer.write("$ext: $count\\n")
        }
    }

    reader.close()
    writer.close()
}