Мини-урок · перед практикой

Частотный анализ

Подсчитываем частоты и сортируем по убыванию частоты, затем по слову.

Как к ней подойти

Потренируйтесь хранить пары «ключ - значение» и находить нужные записи в словаре.

Коротко о теме

Словарь связывает ключ со значением и позволяет быстро найти запись по ключу. Решите, что будет ключом, что значением и как обрабатывать отсутствующую запись. Для подсчётов удобно начинать с нуля.

Ключевая идея · Составной ключ сортировки

Отрицательная частота превращает убывание в обычную сортировку по возрастанию; второй компонент разрешает равенства.

Проверьте перед запуском

  • reverse=True для пары (частота, слово) развернёт и алфавитный порядок, что неверно.

Сравните свой подход

Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.

Ваше принятое решение

Рекомендуемое решение: Составной ключ сортировки

Отрицательная частота превращает убывание в обычную сортировку по возрастанию; второй компонент разрешает равенства.

counts = {}
for _ in range(int(input())):
    for word in input().split():
        counts[word] = counts.get(word, 0) + 1
for word in sorted(counts, key=lambda word: (-counts[word], word)):
    print(word)

Время: Ожидаемое O(W + U log U) плюс обработка символов, U — разных слов. Память: O(U + L) слов и текущая строка.

Другой способ: Группы по частоте

Разделяем слова на группы равной частоты, обходим частоты от больших к малым и отдельно сортируем слова в каждой группе.

from collections import Counter
counts = Counter()
for _ in range(int(input())):
    counts.update(input().split())
buckets = {}
for word, count in counts.items():
    buckets.setdefault(count, []).append(word)
for count in sorted(buckets, reverse=True):
    for word in sorted(buckets[count]):
        print(word)

Время: O(W + U log U) плюс обработка символов. Память: O(U + L).