Sub-dictionary

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

요약
각 단어의 뜻풀이가 다른 단어만 사용하는 사전에서, 모든 단어를 스스로 익힐 수 있도록 먼저 가르쳐야 할 가장 작은 자기완결적 부분사전을 찾는다.
난이도

보통10점 중 7점

유형
그래프, 그리디, 위상 정렬, 구현
정답자
아직 제출이 없습니다

문제

이 문제에서 사전(dictionary) 은 알파벳 오름차순으로 정렬된 여러 단어와, 각 단어의 뜻(정의)을 담고 있다. 모든 정의는 같은 사전 안에 있는 단어들만으로 쓰여 있다. 사전이 NN개의 단어를 정의한다면, 정의에 쓰이는 단어까지 모두 포함해도 서로 다른 단어는 정확히 NN개뿐이다. 또한 어떤 단어도 자기 자신의 정의에는 등장하지 않는다.

Sub-dictionary(부분 사전) 는 원래 사전의 단어들 중 일부만 골라 만든 사전으로, 그 자체로도 완전한 사전이어야 한다. 즉 sub-dictionary 안의 어떤 단어의 정의에 등장하는 모든 단어는 반드시 그 sub-dictionary 안에도 정의되어 있어야 하며, 그래야 sub-dictionary 하나만으로 독립된 사전이 된다.

컴퓨터에게 언어를 가르치는 프로젝트가 진행 중이다. 먼저 사전을 입력해 단어를 가르치고, 그 단어들만으로 만든 문장을 입력하면 컴퓨터가 문장의 뜻을 해석해 원하는 동작을 수행한다.

컴퓨터가 단어를 스스로 익히게 하려고, 먼저 어떤 sub-dictionary에 속한 단어들을 사람이 직접 가르쳐 이해시킨다. 그다음부터는 컴퓨터가 스스로 학습한다. 어떤 단어의 정의에 쓰인 단어를 컴퓨터가 모두 알고 있으면 그 단어도 새로 배울 수 있고, 새로 배운 단어는 또 다른 단어를 배우는 데 쓰인다. 예를 들어 컴퓨터가 단어 "xyz"를 이해하려면 "xyz"의 정의에 쓰인 다른 모든 단어를 이미 알고 있어야 한다.

사람이 직접 가르쳐야 하는 단어의 수가 가장 적도록, 즉 컴퓨터가 사전의 모든 단어를 스스로 학습할 수 있게 하는 가장 작은 sub-dictionary 를 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어진다.

각 테스트 케이스의 첫 줄에는 사전에 정의된 단어의 개수 nn이 주어진다. (1≤n≤1001 \le n \le 100)

이어지는 nn개의 줄에는 각 단어의 정의가 한 줄에 하나씩 주어진다. 각 줄의 첫 번째 단어가 정의되는 단어이고, 같은 줄의 나머지 단어들이 그 정의에 쓰인 단어들이다. 즉 첫 번째 단어를 이해하려면 나머지 단어들을 모두 알아야 한다. 한 단어의 정의에는 최대 3030개의 단어가 쓰인다.

모든 단어는 공백으로 구분되며, 영소문자로만 이루어지고 길이는 2525글자 미만이다.

입력의 끝은 n=0n = 0인 줄로 표시되며, 이 줄은 처리하지 않는다.

출력

각 테스트 케이스마다 두 줄을 출력한다. 첫 줄에는 조건을 만족하는 가장 작은 sub-dictionary에 속한 단어의 개수를 출력하고, 둘째 줄에는 그 단어들을 알파벳 오름차순으로 공백으로 구분해 출력한다. 가장 작은 sub-dictionary가 공집합이면 둘째 줄은 빈 줄로 출력한다.

예제3

  1. 예제 1

    입력
    5
    aue oizer piqoi oizer
    doy oizer hweqlo hweqlo
    hweqlo piqoi aue
    oizer piqoi
    piqoi aue aue
    0
    
    예상 출력
    3
    aue oizer piqoi
    
  2. 예제 2

    입력
    2
    a b
    b a
    0
    
    예상 출력
    2
    a b
    
  3. 예제 3

    입력
    3
    a b
    b c
    c
    0
    
    예상 출력
    0