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

Полиглоты

Общие языки получаем пересечением, все известные — объединением.

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

Увидите, как множества помогают сравнивать группы без повторяющихся элементов.

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

Множество хранит каждый элемент один раз. Пересечение a & b оставляет общие элементы, разность a - b - только элементы a, а объединение a | b собирает обе группы. Если важен порядок вывода, отсортируйте результат отдельно.

Ключевая идея · Операции множеств

Первое множество задаёт начало пересечения; пустое пересечение дальше остаётся пустым.

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

  • Оба списка выводятся в лексикографическом порядке, каждый язык на отдельной строке.

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

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

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

Рекомендуемое решение: Операции множеств

Первое множество задаёт начало пересечения; пустое пересечение дальше остаётся пустым.

n = int(input())
common = None
all_languages = set()
for _ in range(n):
    languages = {input() for _ in range(int(input()))}
    all_languages.update(languages)
    common = languages if common is None else common & languages
common = common or set()
print(len(common))
for language in sorted(common):
    print(language)
print(len(all_languages))
for language in sorted(all_languages):
    print(language)

Время: O(T+U log U) в среднем. Память: O(U+L) названий.

Другой способ: Количество знающих

Язык общий тогда и только тогда, когда его знают n разных школьников. T — число записей языков, U — разных языков, L — максимум у одного школьника.

n = int(input())
counts = {}
for _ in range(n):
    languages = {input() for _ in range(int(input()))}
    for language in languages:
        counts[language] = counts.get(language, 0) + 1
common = sorted(language for language in counts if counts[language] == n)
print(len(common))
for language in common:
    print(language)
print(len(counts))
for language in sorted(counts):
    print(language)

Время: O(T+U log U) в среднем. Память: O(U+L) названий.