재고실 전산화하기

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

문제

Jobs는 어느 컴퓨터 제조 회사가 설립될 때부터 근무해 온 재고 담당 직원입니다. 그는 컴퓨터 부품을 보관하는 재고실에서 일어나는 모든 거래를 관리합니다. Jobs는 구식이라, 아직도 모든 거래를 수첩에 손으로 기록하며 거래 기록을 전산화하는 것을 늘 거부해 왔습니다. 그런데 오늘, 상사가 재고실의 현재 상태 — 즉 현재 직원들에게 지급된 컴퓨터와 재고실에 남아 있는 정상·고장 부품 — 를 요약한 보고서를 요청하면서 상황이 바뀌었습니다. 보고서 마감은 오늘 밤이고, 수첩에 적힌 수많은 거래로부터 손으로 보고서를 만들 시간이 없습니다. 그래서 그는 모든 거래를 입력으로 받아 보고서를 출력하는 프로그램을 작성해 달라고 여러분에게 부탁합니다.

수첩의 각 거래는 날짜·시각으로 시작하며, 그 뒤에 다음 형식 중 하나가 이어집니다:

  • Bought <NUM> <PIECE>.
  • Assembled a computer for <PERSON> using <PIECES>.
  • Got the computer of <PERSON> back and disassembled it.
  • Found that <A> <PIECE> is not working.
  • <A> <PIECE> is repaired and now can be used again.

위에서 사용된 자리표시자는 다음과 같이 정의됩니다(문장의 맨 앞에 올 경우 첫 글자는 대문자로 표기됩니다):

  • <A>: 뒤따르는 단어에 따라 "a" 또는 "an"입니다.
  • <NUM>: <A>(즉 1을 의미)이거나, "K items of"이며 여기서 K는 1보다 큰 정수입니다.
  • <PERSON>: 직원의 전체 이름으로, 각각 대문자로 시작하는 하나 이상의 공백으로 구분된 단어들로 이루어집니다.
  • <PIECES>: <NUM> <PIECE> 항목들을 쉼표로 구분한 목록입니다. 목록에는 항상 최소 2개의 항목이 있으며, 마지막 쉼표 뒤(마지막 항목 앞)에 "and"가 추가로 붙습니다.
  • <PIECE>: RAM이나 CPU 같은 컴퓨터 부품 이름을 포함하는 문구이며, 모델·속도·용량 등을 나타내는 추가 정보가 붙을 수 있습니다.

각 개체(부품 종류 또는 직원 이름)는 항상 대소문자를 구별하는 유일한 문구로 지칭되며, 서로 다른 두 개체가 (대소문자를 무시하더라도) 같은 문구로 지칭되는 일은 없다고 가정할 수 있습니다. 구입된 모든 부품은 처음에는 정상이며, 컴퓨터 조립에는 정상 부품만 사용됩니다. 각 직원은 어느 시점에도 최대 한 대의 컴퓨터만 소유하며, 모든 거래는 기록되는 시점에 논리적으로 유효합니다.

입력

입력에는 여러 개의 테스트 케이스가 있습니다. 각 테스트 케이스는 거래의 개수를 나타내는 정수 $n$ ($1 \le n \le 500$)이 적힌 줄로 시작하고, 이어서 $n$개의 거래가 주어집니다.

각 거래는 "year-month-day hour" 형식의 날짜·시각으로 시작하며, year, month, day, hour는 각각 $[2000, 2012]$, $[1, 12]$, $[1, 31]$, $[0, 23]$ 범위에 있고, 10 미만인 값은 앞에 "0"이 붙어 채워질 수 있습니다. 한 테스트 케이스 안에서 날짜·시각은 모두 서로 다르며, 거래가 반드시 시간 순서대로 주어지지는 않으므로 날짜·시각의 오름차순으로 처리해야 합니다. 날짜·시각과 거래 문장은 " - " (공백, 붙임표, 공백) 문자열로 구분됩니다.

<NUM>에 나오는 모든 수는 $10^5$ 미만입니다. 연속된 두 단어는 하나의 공백으로 구분됩니다. 직원 이름과 부품 종류 문구는 큰따옴표로 감싸여 있으며, 큰따옴표 안의 모든 문자는 영숫자입니다.

입력은 "0" 하나만 있는 줄로 끝나며, 이 줄은 테스트 케이스로 처리하지 않습니다.

출력

각 테스트 케이스마다 여러 줄을 출력합니다.

먼저, 현재 컴퓨터를 소유한 직원 수 $X$를 다음 형식으로 출력합니다:

  • $X > 1$이면: There are X employees who currently have a computer:
  • $X = 1$이면: There is one employee who currently has a computer:
  • $X = 0$이면: No computer is currently given out to the employees.

그다음, $X > 0$이면 그 직원들의 전체 이름을 한 줄에 하나씩 총 $X$줄 출력합니다. 이 줄들은 사전식 순서로 정렬되어야 합니다.

이어서, 수첩에 등장하는 모든 부품 종류에 대해 한 줄씩(종류마다 정확히 한 줄), 부품 문구의 사전식 순서로 정렬하여 출력합니다. 각 부품 문구 <PIECE>에 대한 줄은 다음 중 하나여야 합니다:

  • 남은 것이 없으면: There is no "<PIECE>" left in the stockroom.
  • 정확히 1개가 남아 있고 정상이면: There is one "<PIECE>" left in the stockroom which is working.
  • 정확히 1개가 남아 있고 고장이면: There is one "<PIECE>" left in the stockroom which is not working.
  • $X$개($X > 1$)가 남아 있고 모두 정상이면: There are X items of "<PIECE>" left in the stockroom, all working.
  • $X$개($X > 1$)가 남아 있고 모두 고장이면: There are X items of "<PIECE>" left in the stockroom, all not working.
  • $X$개($X > 1$)가 남아 있고 그중 $Y$개가 정상, $Z$개가 고장이면($Y, Z > 0$): There are X items of "<PIECE>" left in the stockroom, Y working and Z not working.

연속된 두 테스트 케이스 사이에는 "###" 한 줄을 출력합니다.

두 개의 여러 단어 문구를 비교할 때는 먼저 두 문구의 첫 단어를 비교하고, 같으면 두 번째 단어를 비교하는 식으로 진행합니다. 더 짧은 문구의 모든 단어가 더 긴 문구의 대응 단어와 일치하면, 더 짧은 문구가 앞섭니다. 단어를 글자 단위로 비교할 때 숫자가 문자보다 앞서고, 문자는 대소문자를 구별하지 않고 비교합니다. 따라서 "A AB" < "A10" < "A2" < "aa" = "AA" < "AA B"입니다.

참고: "재고실에 남아 있는" 것으로 세는 대상은 실제로 재고실에 있는 부품뿐이며, 현재 조립되어 있는 컴퓨터 안의 부품은 세지 않습니다. 컴퓨터를 분해하면 그 안의 모든 부품은 정상 상태로 재고실에 되돌아옵니다. "Found that ... is not working" 거래는 재고실에 있는 정상 부품 하나를 고장 상태로, "... is repaired ..." 거래는 재고실에 있는 고장 부품 하나를 다시 정상 상태로 바꿉니다.