Задача: проверить, встречалось ли каждое название гусеницы раньше в списке. Для каждого названия вывести YES/NO (мы будем использовать ДА/НЕТ согласно условию).
Алгоритм (пояснение шаг за шагом)
- Вход может быть в двух форматах:
- Первая строка — целое число N, затем N строк с существующими названиями. Далее идут названия для проверки — для каждого нужно ответить, встречалось ли оно ранее (в списке существующих и ранее встречавшихся проверяемых).
- Просто список названий без числа в начале. Для каждого названия в очередности выводим ДА, если оно уже встречалось ранее в списке; иначе НЕТ и добавляем название в множество просмотренных.
- Реализация: читаем все строки, удаляем пустые. Если первая строка целое число N, используем формат 1; иначе — формат 2.
- Для проверки используем множество. Для каждого названия: если оно уже в множестве — выводим ДА; иначе — НЕТ и добавляем название в множество.
- Сложность: время — O(k), где k — количество обработанных названий; память — O(u), где u — количество уникальных названий.
Пример соответствия с форматом из условия:
- Если первые 4 строки — существующие названия, а затем две строки — проверки, то для последних двух названий вывод будет ДА, ДА (как в примере).
Код на Python 3 (робастный к двум форматам ввода):
import sys
def is_int(s: str) -> bool:
try:
int(s)
return True
except ValueError:
return False
def main():
data = sys.stdin.read().splitlines()
# Удаляем пустые строки, чтобы не мешать парсингу
lines = [line.strip() for line in data if line.strip() != ""]
if not lines:
return
# Формат 1: первая строка целое число N
if is_int(lines[0]):
n = int(lines[0])
idx = 1
seen = set()
# Добавляем первые N существующих названий
for i in range(n):
if idx >= len(lines):
break
seen.add(lines[idx])
idx += 1
# Обработка оставшихся строк как запросов
out = []
while idx < len(lines):
name = lines[idx]
if name in seen:
out.append("ДА")
else:
out.append("НЕТ")
seen.add(name)
idx += 1
if out:
print("\n".join(out))
# Если не было запросов, просто завершиться без вывода
return
# Формат 2: весь вход — последовательность названий
seen = set()
out = []
for name in lines:
if name in seen:
out.append("ДА")
else:
out.append("НЕТ")
seen.add(name)
print("\n".join(out))
if __name__ == "__main__":
main()
Пояснения к выводу
- В задаче обычно требуется выводить ДА, если название уже встречалось ранее, и НЕТ — если это новое название.
- Пример из описания: первые четыре названия — новые, поэтому НЕТ (или НЕТ/НЕТ/НЕТ/НЕТ в зависимости от используемой надписи), пятые и шестые совпадают с ранее встречавшимися, поэтому ДА, ДА.
- Обратите внимание: в вашем тестовом окружении возможно требование именно ДА/НЕТ или их русские аналоги. По умолчанию в коде выше используются ДА и НЕТ.
Если хотите, могу адаптировать вывод под конкретный формат (например, точно "YES"/"NO" или другой набор слов).