AB-단어
시간 제한1초메모리 제한128 MB
최대 1000개의 nice ab-word(균형 잡힌 괄호 문자열)가 주어질 때, 재귀적으로 정의된 유사 관계에서 서로 유사하지 않은 단어들의 최대 부분집합의 크기를 구한다.
문제
소문자 a와 b로 이루어진 모든 수열(빈 수열 포함)을 ab-단어라고 부른다. 이 ab-단어이고 이면, 는 로 이루어진 부분 단어를 뜻한다.
ab-단어 에서 a의 개수와 b의 개수가 서로 같고, 모든 에 대해 접두사 의 a 개수가 b 개수 이상이면, 이 단어를 좋은(nice) 단어라고 한다.
좋은 ab-단어 사이의 유사성(similarity)은 다음과 같이 귀납적으로 정의한다.
- 빈 ab-단어 둘은 서로 유사하다.
- 비어 있지 않은 두 좋은 ab-단어 와 는 길이가 같고() 아래 조건 중 하나 이상을 만족하면 서로 유사하다.
- , 이고, 와 가 모두 좋은 단어이면서 서로 유사하다. 또는
- 어떤 ()가 존재하여 와 가 모두 좋은 단어이고, 다음 중 하나가 성립한다.
- 와 가 모두 좋은 단어이며, 는 와 유사하고 는 와 유사하다. 또는
- 와 가 모두 좋은 단어이며, 는 와 유사하고 는 와 유사하다.
비어 있지 않은 좋은 ab-단어들의 집합 의 다양성 수준(level of diversity)은, 고른 어떤 두 단어도 서로 유사하지 않도록 에서 고를 수 있는 단어의 최대 개수이다.
표준 입력에서 집합 를 읽어 의 다양성 수준을 계산하고, 그 결과를 표준 출력에 출력하는 프로그램을 작성하여라.
입력
첫째 줄에 집합 의 원소 개수 이 주어진다 (). 다음 개의 줄에는 각각 의 원소, 즉 좋은 ab-단어가 한 줄에 하나씩 주어진다. 각 단어는 줄의 맨 앞에서 시작하며 글자 사이에 공백은 없다. 모든 ab-단어의 길이는 이상 이하이다.
출력
의 다양성 수준을 나타내는 정수 하나를 출력한다.