Полиглоты
Вы решили задачу. Теперь можно сравнить подходы.
Общие языки получаем пересечением, все известные — объединением.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Операции множеств
Первое множество задаёт начало пересечения; пустое пересечение дальше остаётся пустым.
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) названий.
На что обратить внимание
- Оба списка выводятся в лексикографическом порядке, каждый язык на отдельной строке.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.