Контрольная по ударениям
Вы решили задачу. Теперь можно сравнить подходы.
Известное слово проверяем по словарю вариантов, неизвестное — по числу заглавных букв.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Два множества
Множество known определяет наличие слова в словаре независимо от ударения, valid содержит разрешённые написания.
n = int(input())
valid = {input() for _ in range(n)}
known = {word.lower() for word in valid}
errors = 0
for word in input().split():
if word.lower() in known:
errors += word not in valid
else:
errors += sum(c.isupper() for c in word) != 1
print(errors)
Время: Ожидаемое O(D + T), D и T — число символов словаря и текста. Память: O(D + T), включая строку упражнения и split.
Другой способ: Словарь разрешённых позиций
Вместо целых вариантов сохраняем индексы допустимых ударений. Ровно одна заглавная буква обязательна в любом случае.
n = int(input())
positions = {}
for _ in range(n):
word = input()
index = next(i for i, c in enumerate(word) if c.isupper())
positions.setdefault(word.lower(), set()).add(index)
errors = 0
for word in input().split():
stress = [i for i, c in enumerate(word) if c.isupper()]
if len(stress) != 1:
errors += 1
elif word.lower() in positions and stress[0] not in positions[word.lower()]:
errors += 1
print(errors)
Время: Ожидаемое O(D + T). Память: O(D + T).
На что обратить внимание
- Для известного слова одной заглавной буквы недостаточно.
- У одного слова может быть несколько разрешённых ударений.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.