Задача №1110. Почти беспрефиксные коды
Разбор добавил Александр Чистяков
Обозначим два важных для решения этой задачи утверждения: 1)Число k однозначно определяет множество префиксов, которыми могут обладать слова в формируемом наборе. (Это все возможные строки из латинских букв длины от 1 до (k+1)) 2)Для каждого слова, добавленного в набор, однозначно определяется префикс, который больше не могут иметь другие слова в наборе. Из этого следует, что из нескольких слов с одинаковым префиксом мы можем добавить в набор любое, но только одно. Поэтому для решения можно использовать следующий алгоритм: 1)Заведём структуру в которую можно добавить строку за O(log N) и проверить наличие строки в данной структуре за O(log N) операций. (Например, подойдёт stl::set для пишущих на C++) 2)Поочерёдно будем обрабатывать слова, подаваемые на ввод: Если префикс этого слова (первые k+1 символ для слов длиннее, чем k или само слово для слов недлиннее чем k) уже присутствует в множестве, то это слово добавлять нельзя - переходим к следующему. Иначе добавляем это слово в набор, а в множество добавляем префикс этого слова. 3)Выводим размер полученного набора и слова в нём Сложность такого алгоритма не превосходит N * log N * k (Количество слов * Поиск/Добавление * Длина префикса) операций, что при аккуратной реализации укладывается в ограничения по времени.
Сдать: для сдачи задач необходимо войти в систему
2465
statement