요금 청구표

시간 제한1초메모리 제한128 MB

요약
범위 기반 접두사 규칙으로 이루어진 기존 요금 테이블과 동일한 판정을 내리면서, 서로 접두사 관계가 없는 최소 개수의 순수 접두사 테이블을 구성하는 문제입니다.
난이도

어려움10점 중 8점

유형
트라이, 그리디, 재귀, 시뮬레이션
정답자
아직 제출이 없습니다

문제

통신에서는 전화번호에 따라 서로 다른 요율이나 요금제가 적용될 수 있다. 한 통신사는 각 통화에 어떤 요금제를 적용할지 결정하는 요금 청구표를 관리한다.

모든 전화번호는 정확히 11자리 숫자로 이루어진다. 기존 청구표는 n개의 줄로 이루어지며, 각 줄은 번호 접두사의 범위를 A - B 형태로 적고 그 뒤에 요금제 이름을 적는다. 이 줄은 앞자리가 그 범위 안에 드는 모든 전화번호와 일치한다. 예를 들어 7919 - 921 줄은 7919, 7920, 7921 중 하나로 시작하는 모든 전화번호와 일치한다.

어떤 통화의 요금제는 청구표를 위에서 아래로 읽어 내려가며 처음으로 일치하는 줄이 결정한다. 어떤 줄과도 일치하지 않으면 그 번호는 유효하지 않으며 요금제가 필요 없다. 한 줄은 특수 요금제 이름 invalid를 사용해 번호를 유효하지 않다고 표시할 수도 있다. 같은 요금제 이름이 서로 매우 다른 번호를 나타내는 여러 줄에 나타날 수도 있다.

기존 청구표에는 불필요한 항목이 있을 수 있어, 통신사는 더 깔끔한 표를 원한다. 새 표는 범위 없이 단순 접두사만으로 이루어진 목록이며, 각 접두사에 요금제 이름이 붙는다. 그리고 표 안의 어떤 접두사도 다른 접두사의 접두사가 되지 않는다. 그러면 한 번의 사전식 조회만으로 임의의 전화번호의 요금제를 알 수 있다. 요금제 invalid는 새 표에 나타나서는 안 된다. 유효하지 않은 번호는 일치하는 접두사가 없는 번호로 정의되기 때문이다. 기존 표의 결정을 정확히 똑같이 재현하는 모든 표 가운데, 줄 수가 가장 적은 표 하나를 출력하라.

입력

첫째 줄에 정수 n (1 ≤ n ≤ 100)이 주어진다. 기존 청구표의 줄 수이다.

다음 n개의 각 줄은 하나의 규칙을 공백으로 구분된 네 개의 토큰으로 나타낸다: 접두사 A, 빼기 기호 -, 접두사 B, 그리고 요금제 이름. 각 접두사는 1자리에서 11자리 숫자로 이루어지고, 각 요금제 이름은 1자에서 20자의 소문자 알파벳으로 이루어진다.

A와 B의 자릿수를 각각 |A|, |B|로 쓴다. 접두사는 1 ≤ |B| ≤ |A| ≤ 11을 만족하며, A의 마지막 |B|자리를 문자열로 볼 때 사전식으로 B보다 작거나 같다. 이 규칙은 앞의 |A| − |B|자리가 A의 앞 |A| − |B|자리와 같고, 그다음 |B|자리가 A의 마지막 |B|자리와 B 사이(양 끝 포함)에 있는 모든 전화번호와 일치한다.

출력

첫째 줄에 정수 k를 출력한다. 새 표가 기존 표를 정확히 나타내기 위해 필요한 최소 줄 수이다.

그다음 k개의 줄에 새 표를 접두사의 사전식 순서로 출력한다. 각 줄은 공백으로 구분된 두 토큰, 즉 접두사(숫자 한 자리 이상)와 그 요금제 이름으로 이루어진다.

모든 전화번호가 유효하지 않다면 숫자 0 하나만 출력한다.

예제4

  1. 예제 1

    입력
    8
    7919 - 921 cell
    7921800 - 999 priv
    1 - 1 usa
    760 - 9 rsv
    7928 - 29 rsv
    7600 - 7899 spec
    73 - 77 invalid
    7 - 7 cis
    
    예상 출력
    35
    1 usa
    70 cis
    71 cis
    72 cis
    76 rsv
    77 spec
    78 spec
    790 cis
    7910 cis
    7911 cis
    7912 cis
    7913 cis
    7914 cis
    7915 cis
    7916 cis
    7917 cis
    7918 cis
    7919 cell
    7920 cell
    7921 cell
    7922 cis
    7923 cis
    7924 cis
    7925 cis
    7926 cis
    7927 cis
    7928 rsv
    7929 rsv
    793 cis
    794 cis
    795 cis
    796 cis
    797 cis
    798 cis
    799 cis
    
  2. 예제 2

    입력
    1
    5 - 5 abc
    
    예상 출력
    1
    5 abc
    
  3. 예제 3

    입력
    2
    12 - 12 a
    1 - 1 b
    
    예상 출력
    10
    10 b
    11 b
    12 a
    13 b
    14 b
    15 b
    16 b
    17 b
    18 b
    19 b
    
  4. 예제 4

    입력
    1
    1234 - 236 p
    
    예상 출력
    3
    1234 p
    1235 p
    1236 p