Полиглоты
Общие языки получаем пересечением, все известные — объединением.
Как к ней подойти
Увидите, как множества помогают сравнивать группы без повторяющихся элементов.
Множество хранит каждый элемент один раз. Пересечение 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) названий.