Интеллектуальное наблюдение за дорожным движением
Недавно господин Хамсадех начал работать инженером по информационным технологиям в центральном отделе управления дорожным движением муниципалитета Тегерана. Сейчас он отвечает за новую систему наблюдения за дорожным движением, которая автоматически распознает номера транспортных средств и выписывает штрафы за нарушения. Система работает уже несколько недель, и теперь господину Хамсадеху нужно начать выписывать штрафы. Однако во время подготовки системы произошел фатальный сбой оборудования сервера базы данных, и все данные были утеряны. Смеясь над своим несчастьем, господин Хамсадех начал проверять другие системы в надежде восстановить данные. Единственная доступная информация — это файлы логов, оставшиеся на сервере приложений. К счастью, все формы ввода данных записываются в сервисном слое сервера приложений, и, таким образом, утерянная информация может быть полностью восстановлена с помощью файлов логов. Но такие задачи по восстановлению данных слишком сложны для господина Хамсадеха, и нет достаточно времени, чтобы настроить новую базу данных, импортировать восстановленные данные и перенастроить всю архитектуру для выдачи штрафов. С глубоким чувством подавленности господин Хамсадех просит вас о помощи. Вам нужно написать программу, которая читает все файлы логов и выдает штрафные квитанции. В следующих параграфах господин Хамсадех описывает правила дорожного движения Тегерана, услуги, предоставляемые системой наблюдения за дорожным движением, формат файлов логов и правила выдачи штрафов.
Каждая дорога рассматривается как находящаяся в одной из трех специфичных для движения зон Тегерана:
Центральная зона ограничения движения (CTRZ)
Зона четных/нечетных ограничений (EORZ)
Неограниченная зона (UZ)
Обычные личные транспортные средства обычно не допускаются в CTRZ в эти временные интервалы:
Суббота по среду с 06:30 до 17:00
Четверг с 06:00 до 13:30
Обычные личные транспортные средства, регистрационный номер которых заканчивается на четную цифру, не допускаются в EORZ в эти временные интервалы:
Воскресенье и вторник с 06:30 до 19:00
Четверг с 06:30 до 17:00
Обычные личные транспортные средства, регистрационный номер которых заканчивается на нечетную цифру, не допускаются в EORZ в эти временные интервалы:
Суббота, понедельник и среда с 06:30 до 19:00
Таким образом, ни одно из этих ограничений зоны не применяется в пятницу (официальные выходные в Иране). Некоторые транспортные средства (включая общественный транспорт и экстренные службы) могут въезжать в CTRZ и EORZ в любое время без ограничений. Обычные транспортные средства также могут въезжать в эти зоны, если они покупают разрешение на один день, но вам не нужно учитывать покупку разрешений в этой задаче. Если транспортное средство незаконно въезжает в CTRZ или EORZ, оно должно быть оштрафовано. Каждое транспортное средство должно быть оштрафовано не более одного раза в день за нарушение ограничений зоны. Если для транспортного средства в один день происходят нарушения как CTRZ, так и EORZ, учитывается нарушение CTRZ, которое естественно имеет более высокий штраф. Каждая дорога изначально считается находящейся в UZ, но это состояние может измениться на основе объявлений. Новые правила всех таких объявлений должны применяться с дня после объявления. Таким же образом, никакие транспортные средства изначально не освобождаются от правил зоны, но исключения добавляются и удаляются со временем. Такие изменения также должны учитываться с следующего дня.
Следующие услуги предоставляются сервером приложений. Каждая услуга имеет соответствующее сообщение журнала, которое записывается в одну строку, начиная с имени услуги, за которым следуют параметры. Как вы увидите в определениях услуг и примерах, параметры услуги выводятся в определенном порядке. Независимо от типа услуги, список параметров каждого сообщения журнала начинается с специальной пары параметров (называемой временной меткой): "day" и "time". Временная метка естественно показывает точное время соответствующего запроса на обслуживание. Параметр "day" — это положительное целое число, показывающее количество дней, прошедших с дня развертывания системы (называемого днем 0). Параметр "time" показывает время запроса в этот день в формате "HH:mm:ss" (00 ≤ HH ≤ 23, 00 ≤ mm, ss ≤ 59).
setRoadZone(day, time, zone, roads)
Параметр "zone" может быть "UZ", "CTRZ" или "EORZ". Параметр "roads" содержит непустой список не обязательно различных названий дорог. С начала следующего дня соответствующие дороги должны рассматриваться в данной "zone" (переопределяя их прежние состояния зоны). Примеры логов:
setRoadZone 2 "09:12:53" "CTRZ" "Enghelab" "Sa'di" "Ferdowsi" "Ferdowsi"
setRoadZone 5 "14:32:01" "EORZ" "Resalat"
setRoadZone 12 "00:00:59" "UZ" "Persian_Gulf"
addZoneException(day, time, vehicles) | removeZoneException(day, time, vehicles)
Параметр "vehicles" содержит непустой список не обязательно различных регистрационных номеров транспортных средств. С начала следующего дня соответствующие транспортные средства {не должны | должны} быть оштрафованы в случае въезда в CTRZ или EORZ в запрещенное время. Эти команды переопределяют прежнее состояние данных транспортных средств (которое может быть тем же состоянием). Примеры логов:
addZoneException 1 "09:00:13" "1234567" "9876543"
removeZoneException 3 "15:33:02" "1234567" "9876345"
addPhotoInfo(day, time, photoId, road, vehicles)
Это одна из ключевых услуг системы. Она не вызывается из пользовательского интерфейса. Она вызывается другой сложной системой: внешним сервером обработки изображений, который анализирует фотографии, сделанные камерами наблюдения. Эта услуга вызывается, когда фотография сделана и проанализирована. Идентификатор проанализированной фотографии указан в параметре "photoId", положительное целое число. Параметр "road" содержит название дороги, с которой была сделана фотография. Сервер обработки изображений обнаруживает транспортные средства на фотографии и извлекает их регистрационные номера с их номеров. Параметр "vehicles" предоставляет список этих регистрационных номеров транспортных средств. Возможно, что этот список пуст, так как на фотографии может не быть транспортных средств. Параметр "timestamp" здесь относится к моменту съемки фотографии. Примеры логов:
addPhotoInfo 18 "03:18:43" 3324249 "Pastor" "6256256" "8888310"
addPhotoInfo 4 "20:47:31" 54 "Mokhberoddoleh,_sar-e_Sa'di"
addPhotoInfo 27 "06:39:14" 112385612 "17-e_shahrivar" "1006016"
Вы можете предположить следующие утверждения:
Объекты параметров всегда находятся в одной из следующих форм:
Целые числа: Все неотрицательные
Строки: Всегда окружены кавычками (")
Списки: Всегда появляются как последний параметр, состоящий из строк, разделенных пробелами до конца строки
Все токены, включая имена услуг и объекты параметров (строки, целые числа и элементы списка), разделены одним пробелом.
Параметр "time", который находится в формате "HH:mm:ss", имеет ровно 8 символов, и все его три части имеют ровно 2 цифры (дополнены "0" в случае, если они меньше 10).
Названия дорог состоят из английского алфавита (как строчные, так и прописные буквы), цифр, дефиса (-), подчеркивания (_), точки (.), запятой (,) и одинарной кавычки ('). Названия дорог не пусты и не длиннее 100 символов.
Все регистрационные номера транспортных средств — это строки ровно из 7 цифр.
Каждая дорога или транспортное средство всегда ссылаются на одну и ту же строку.
Никакие две временные метки не совпадают точно.
Если в один день есть конфликтующие команды, более новая команда (та, у которой больше временная метка) должна переопределить более старую. Вы можете предположить, что услуга "addPhotoInfo" вызывается не более одного раза для каждого photoId.
Каждый регистрационный номер транспортного средства появляется не более одного раза на каждой фотографии.
Время работы системы составляет не более 300 дней.
Транспортное средство должно быть оштрафовано за незаконный въезд в зону, даже если его фотография была сделана на границах времени (например, в понедельник 6:30:00).
Транспортные средства должны быть оштрафованы на основе результатов анализа фотографий. Как было сказано ранее, штрафные квитанции за въезд в зону должны выдаваться для каждого транспортного средства не более одного раза в день. Все фотографии такого нарушения в день должны быть приложены к соответствующей штрафной квитанции. Приложения фотографий к квитанции должны быть отсортированы в порядке возрастания по времени. Обратите внимание, что если одновременно происходят въезды в CTRZ и EORZ для транспортного средства, все фотографии обоих нарушений должны быть приложены, но квитанция должна быть выдана с штрафом за CTRZ. Порядок печати квитанций также важен. Квитанции должны быть в первую очередь отсортированы по транспортным средствам так, чтобы их регистрационные номера появлялись в лексикографическом порядке. Квитанции для одного транспортного средства должны затем быть отсортированы в порядке возрастания по дню нарушения.
Входные данные
Входные данные состоят из нескольких тестовых случаев. Каждый тестовый случай начинается с строки, содержащей одно целое число N, общее количество строк в файлах логов (1 ≤ N ≤ 1000). Вторая строка содержит строку W, за которой следуют два положительных целых числа CTP и EOP. Строка является одним из слов "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", или "Friday", указывающим день недели дня развертывания (день 0). Числа CTP и EOP — это значения штрафов за незаконный въезд в CTRZ и EORZ соответственно (EOP < CTP). Каждая из следующих N строк содержит лог службы в формате, указанном ранее. Логи не обязательно отсортированы в каком-либо специальном порядке, так как это результат конкатенации многих файлов логов. Каждая строка имеет не более 1000 символов. Все целые числа во входных данных меньше 10^9. Входные данные заканчиваются строкой, содержащей "0" (опустите кавычки).
Выходные данные
Для каждого тестового случая вы должны напечатать штрафные квитанции в ранее указанном порядке. Каждая квитанция имеет основное тело и одно или несколько приложенных фотографий. Основное тело должно быть напечатано первым в одной строке в следующем формате:
vehicle: "NUMBER", day: DAY, offence: "OFFENCE", penalty: PENALTY
Вот значение заполнителей в этом шаблоне:
NUMBER: Регистрационный номер транспортного средства, нарушившего закон
DAY: День нарушения; нумеруется как параметры временной метки
OFFENCE: Указывает тип нарушения и всегда является одной из следующих строк:
Незаконный въезд в CTRZ
Незаконный въезд в EORZ
Незаконный въезд в CTRZ EORZ
PENALTY: Сумма, которую водитель транспортного средства должен заплатить по этой квитанции
Каждое приложение фотографии должно появляться в отдельной строке. Они должны быть напечатаны в порядке, указанном ранее. Приложения фотографий должны иметь следующий формат:
photo: PHOTO-ID, time: "TIME", road: "ROAD"
Вот значение заполнителей в шаблоне приложений фотографий:
PHOTO-ID: Это идентификатор приложенной фотографии. Он используется реальным рендерером квитанции для печати фотографии.
TIME: Время съемки соответствующей фотографии в формате "HH:mm:ss" (точно так же, как временная метка)
ROAD: Название дороги, на которой была сделана соответствующая фотография
Следуйте указанным форматам точно, особенно порядку параметров, пробелам, пунктуации и кавычкам. Напечатайте строку, содержащую "###" между каждыми двумя последовательными тестовыми случаями.