소의 진화

시간 제한2초메모리 제한512 MB

요약
각 부분 집단이 가진 특징 집합 N개가 주어질 때, 모든 특징이 정확히 한 간선에서 처음 생겨나는 진화 나무로 이 집단들을 설명할 수 있는지 판정한다.
난이도

보통10점 중 7점

유형
트리, 재귀, 분할 정복, 구현
정답자
아직 제출이 없습니다

문제

서기 3019년, 지난 천 년 동안 놀라울 정도로 많은 소의 진화가 일어나 다양한 특징을 지닌 소들이 생겨났다.

소의 진화 기록은 트리로 나타낼 수 있다. 트리의 뿌리에는 특별한 특징이 없는 기본 조상 소가 있다. 트리의 각 자손 단계에서는 모든 소가 새로운 특징을 진화시키거나(아래 그림에서 점박이 소가 모두 불을 뿜게 된 것처럼), 소 집단이 갈라져 일부 소는 새로운 특징을 진화시키고(예: 날기) 일부는 그렇지 않다.

트리 맨 아래의 잎은 3019년에 존재하는 소 부분 집단을 나타낸다. 어떤 두 잎(부분 집단)도 같은 특징 집합을 갖지 않는다. 예를 들어 부분 집단 #1은 특별한 특징이 없는 소들을 포함하고, 부분 집단 #3은 염력이 있고 날 수 있는 소들을 포함한다. 반대로 부분 집단 #2는 날지만 염력은 없는 소들이다. 부분 집단 #3은 날기와 염력을 함께 가진 조합이 유일하다.

위와 같은 진화 트리가 "적절(proper)"하다는 것은 새로 진화한 각 특징이 트리의 정확히 하나의 간선에서 시작됨을 뜻한다(즉, 역사상 한 시점에서 진화해 나타났음을 뜻한다). 예를 들어 점박이 특징이 두 개의 서로 다른 가지에서 진화해 나타난 트리는 적절하지 않다. 3019년의 소 부분 집단에 대한 설명이 주어질 때, 이들이 적절한 진화 트리로 설명될 수 있는지 판별하라.

입력

첫 줄에는 부분 집단의 수 NN이 주어진다(2≤N≤252 \leq N \leq 25). 다음 NN개 줄 각각은 하나의 부분 집단을 나타낸다. 줄은 정수 KK(0≤K≤250 \leq K \leq 25)로 시작하고, 이어서 그 부분 집단의 모든 소가 가진 KK개의 특징이 주어진다. 특징은 길이 20 이하의 소문자(a..z) 문자열이다. 두 부분 집단이 정확히 같은 특징을 갖는 경우는 없다.

출력

이 부분 집단들의 기원을 설명하는 적절한 진화 트리를 만들 수 있으면 "yes", 그렇지 않으면 "no"를 출력하라.

예제1

  1. 예제 1

    입력
    4
    2 spots firebreathing
    0
    1 flying
    2 telepathic flying
    
    예상 출력
    yes