지능형 교통 감시

아직 제출이 없습니다시간 제한1초메모리 제한128 MB

문제

테헤란 중앙 교통 관제소는 감시 카메라 사진에서 번호판을 읽어 자동으로 과태료 고지서를 발부하는 시스템을 운영한다. 그런데 데이터베이스 서버의 저장 장치가 하드웨어 고장을 일으켜 데이터가 전부 사라졌다. 남은 자료는 애플리케이션 서버의 로그 파일뿐이다. 다행히 모든 데이터 입력이 서비스 계층을 거치면서 로그로 남기 때문에 로그만으로 잃어버린 정보를 되살릴 수 있다. 로그 파일을 읽어 과태료 고지서를 발부하는 프로그램을 작성하라.

모든 도로는 다음 세 구역 중 하나에 속한다.

  • 중심가 통행 제한 구역(CTRZ)
  • 홀짝 통행 제한 구역(EORZ)
  • 비제한 구역(UZ)

일반 승용차는 다음 시간대에 CTRZ에 진입할 수 없다.

  • 토요일부터 수요일까지, 06:30부터 17:00까지
  • 목요일, 06:00부터 13:30까지

등록번호가 짝수로 끝나는 일반 승용차는 다음 시간대에 EORZ에 진입할 수 없다.

  • 일요일과 화요일, 06:30부터 19:00까지
  • 목요일, 06:30부터 17:00까지

등록번호가 홀수로 끝나는 일반 승용차는 토요일, 월요일, 수요일 06:30부터 19:00까지 EORZ에 진입할 수 없다.

이란의 공식 휴일은 금요일이므로 금요일에는 어떤 구역 제한도 적용되지 않는다. 제한 시간대의 시작과 끝 경계도 제한 시간에 포함된다. 예를 들어 월요일 06:30:00에 사진이 찍힌 차량도 과태료를 물어야 한다.

대중교통과 긴급 차량을 비롯한 일부 차량은 시간에 상관없이 CTRZ와 EORZ에 진입할 수 있다. 일반 승용차도 하루짜리 통행 허가를 사면 진입할 수 있지만, 이 문제에서 허가 구매는 고려하지 않는다. 차량이 CTRZ나 EORZ에 불법으로 진입하면 과태료를 물린다. 구역 위반 과태료는 한 차량에 하루 최대 한 건만 발부한다. 같은 날 CTRZ 위반과 EORZ 위반이 함께 일어나면 과태료가 더 비싼 CTRZ 위반으로 발부한다.

모든 도로는 처음에 UZ이고, 처음에는 구역 규정을 면제받는 차량이 없다. 공지가 이 상태를 바꾸며, 공지한 다음 날부터 새 규칙을 적용한다. 면제 대상을 추가하거나 해제하는 변경도 같은 방식으로 다음 날부터 적용한다.

애플리케이션 서버가 제공하는 서비스는 아래와 같다. 서비스마다 로그 메시지가 하나씩 대응하고, 서비스 이름 다음에 매개변수를 이어 한 줄로 적는다. 매개변수는 서비스 정의에 나온 순서대로 기록한다. 서비스 종류와 상관없이 모든 로그의 매개변수 목록은 타임스탬프라고 부르는 day와 time 쌍으로 시작한다. 타임스탬프는 그 서비스 요청이 일어난 정확한 시각이다. day는 시스템을 배치한 날(0일)부터 며칠이 지났는지 나타내는 0 이상의 정수다. time은 그날의 요청 시각을 HH:mm:ss 형식으로 나타낸다(00HH2300 \le HH \le 23, 00mm,ss5900 \le mm, ss \le 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는 비어 있지 않은 차량 등록번호 목록이고, 같은 번호가 여러 번 나올 수 있다. addZoneException은 다음 날부터 이 차량들이 금지 시간에 CTRZ나 EORZ에 진입해도 과태료를 물지 않게 하고, removeZoneException은 다시 과태료를 물게 한다. 두 명령은 목록에 적힌 차량의 이전 상태를 덮어쓴다. 상태가 그대로인 경우에도 덮어쓴다. 로그는 다음과 같은 모양으로 남는다.

addZoneException 1 "09:00:13" "1234567" "9876543"
removeZoneException 3 "15:33:02" "1234567" "9876345"

addPhotoInfo(day, time, photoId, road, vehicles)

이 서비스는 사용자 인터페이스 계층이 아니라 감시 카메라 사진을 분석하는 외부 영상 처리 서버가 호출한다. 사진을 찍어 분석할 때마다 한 번 호출된다. photoId는 분석한 사진의 식별자인 양의 정수다. road는 사진을 찍은 도로의 이름이다. 영상 처리 서버는 사진에서 차량을 찾아 번호판에서 등록번호를 읽고, vehicles에 그 등록번호 목록을 담는다. 사진에 차량이 없을 수도 있어서 이 목록은 비어 있을 수 있다. 여기서 타임스탬프는 사진을 찍은 순간을 뜻한다. 로그는 다음과 같은 모양으로 남는다.

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"

다음 조건을 가정해도 된다.

  • 매개변수는 항상 다음 세 형태 중 하나다. 정수는 모두 0 이상이다. 문자열은 항상 따옴표(")로 감싼다. 목록은 항상 마지막 매개변수로 나오며, 공백으로 구분된 문자열이 줄 끝까지 이어진다.
  • 서비스 이름과 매개변수, 목록 원소를 포함한 모든 토큰은 공백 한 칸으로 구분한다.
  • HH:mm:ss 형식인 time은 정확히 8글자이고, 세 부분 모두 정확히 두 자리다. 10보다 작으면 0을 채운다.
  • 도로 이름은 영문 알파벳 대소문자, 숫자, 붙임표(-), 밑줄(_), 점(.), 쉼표(,), 작은따옴표(')로 이루어진다. 도로 이름은 비어 있지 않고 100글자를 넘지 않는다.
  • 차량 등록번호는 모두 정확히 일곱 자리 숫자로 된 문자열이다.
  • 같은 도로나 같은 차량은 항상 같은 문자열로 적는다.
  • 완전히 같은 타임스탬프가 두 개 있는 경우는 없다.
  • 같은 날에 서로 충돌하는 명령이 있으면 타임스탬프가 더 큰 쪽이 앞선 명령을 덮어쓴다.
  • addPhotoInfo는 photoId마다 최대 한 번 호출된다.
  • 한 사진에 같은 등록번호가 두 번 나오는 경우는 없다.
  • 시스템은 최대 300일 동안 돌아간다.

과태료는 사진 분석 결과를 바탕으로 물린다. 구역 진입 과태료 고지서는 한 차량에 하루 최대 한 건만 발부하고, 그날 그 위반에 해당하는 사진을 모두 고지서에 첨부한다. 첨부 사진은 찍은 시각이 이른 것부터 정렬한다. 한 차량에 CTRZ 진입과 EORZ 진입이 같이 일어나면 두 위반의 사진을 모두 첨부하되 고지서는 CTRZ 과태료로 발부한다. 고지서를 출력하는 순서도 중요하다. 먼저 차량 등록번호를 사전순으로 정렬하고, 같은 차량의 고지서는 위반 날짜가 이른 것부터 정렬한다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 로그 파일에 담긴 줄의 총 개수 NN이 주어진다(1N10001 \le N \le 1000). 둘째 줄에는 문자열 WW와 양의 정수 CTPCTP, EOPEOP가 주어진다. WW는 Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday 중 하나이고, 시스템을 배치한 날(0일)의 요일을 뜻한다. CTPCTPEOPEOP는 각각 CTRZ 불법 진입과 EORZ 불법 진입의 과태료이며 EOP<CTPEOP < CTP이다. 다음 NN개의 줄에는 앞에서 설명한 형식의 서비스 로그가 한 줄에 하나씩 주어진다. 이 로그는 여러 로그 파일을 이어 붙인 결과라서 특별한 순서로 정렬되어 있지 않다. 각 줄은 1000글자를 넘지 않는다. 입력에 나오는 모든 정수는 10910^9보다 작다. 입력의 끝에는 0만 적힌 줄이 주어진다.

출력

각 테스트 케이스마다 앞에서 정한 순서로 과태료 고지서를 출력한다. 고지서는 본문 하나와 첨부 사진 하나 이상으로 이루어진다. 본문을 다음 형식으로 한 줄에 먼저 출력한다.

vehicle: "NUMBER", day: DAY, offence: "OFFENCE", penalty: PENALTY

각 자리의 뜻은 다음과 같다.

  • NUMBER: 법규를 위반한 차량의 등록번호
  • DAY: 위반한 날. 타임스탬프의 day와 같은 방식으로 센다.
  • OFFENCE: 위반 종류. 항상 Outlawed entrance to CTRZ, Outlawed entrance to EORZ, Outlawed entrance to CTRZ & EORZ 중 하나다.
  • PENALTY: 이 고지서로 운전자에게 부과하는 금액

첨부 사진은 앞에서 정한 순서로 한 줄에 하나씩 다음 형식으로 출력한다.

photo: PHOTO-ID, time: "TIME", road: "ROAD"

각 자리의 뜻은 다음과 같다.

  • PHOTO-ID: 첨부한 사진의 식별자. 실제 고지서 렌더러가 사진을 인쇄할 때 쓴다.
  • TIME: 그 사진을 찍은 시각. 타임스탬프와 똑같이 HH:mm:ss 형식으로 적는다.
  • ROAD: 그 사진을 찍은 도로의 이름

매개변수 순서, 공백, 문장 부호, 따옴표까지 정해진 형식을 정확히 지켜야 한다. 이웃한 두 테스트 케이스 사이에는 ###만 적힌 줄을 출력한다.