Права доступа
Вы решили задачу. Теперь можно сравнить подходы.
Сопоставляем файлам разрешения, а названиям операций — буквы.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Множества разрешений
Запрос сводится к проверке одной буквы в разрешениях конкретного файла.
rights = {}
for _ in range(int(input())):
name, *allowed = input().split()
rights[name] = set(allowed)
operation = {'read': 'R', 'write': 'W', 'execute': 'X'}
for _ in range(int(input())):
action, name = input().split()
print('OK' if operation[action] in rights[name] else 'Access denied')
Время: O(N+M) в среднем. Память: O(N) записей.
Другой способ: Битовые маски
Каждому праву выделяем один бит; побитовое И проверяет наличие нужного бита.
bits = {'R': 1, 'W': 2, 'X': 4}
rights = {}
for _ in range(int(input())):
name, *allowed = input().split()
mask = 0
for letter in allowed:
mask |= bits[letter]
rights[name] = mask
operation = {'read': 1, 'write': 2, 'execute': 4}
for _ in range(int(input())):
action, name = input().split()
print('OK' if rights[name] & operation[action] else 'Access denied')
Время: O(N+M) в среднем. Память: O(N) записей.
На что обратить внимание
- В запросе сначала операция, затем файл; execute соответствует X, а не E.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.