소문자 a와 b로 이루어진 모든 수열(빈 수열 포함)을 ab-단어라고 부른다. X=[x1,…,xn]이 ab-단어이고 1≤i≤j≤n이면, X[i..j]는 xi,…,xj로 이루어진 부분 단어를 뜻한다.
ab-단어 X=[x1,…,xn]에서 a의 개수와 b의 개수가 서로 같고, 모든 i=1,…,n에 대해 접두사 X[1..i]의 a 개수가 b 개수 이상이면, 이 단어를 좋은(nice) 단어라고 한다.
좋은 ab-단어 사이의 유사성(similarity)은 다음과 같이 귀납적으로 정의한다.
- 빈 ab-단어 둘은 서로 유사하다.
- 비어 있지 않은 두 좋은 ab-단어 X=[x1,…,xn]와 Y=[y1,…,ym]는 길이가 같고(n=m) 아래 조건 중 하나 이상을 만족하면 서로 유사하다.
- x1=y1, xn=yn이고, X[2..n−1]와 Y[2..n−1]가 모두 좋은 단어이면서 서로 유사하다. 또는
- 어떤 i (1≤i≤n)가 존재하여 X[1..i]와 X[i+1..n]가 모두 좋은 단어이고, 다음 중 하나가 성립한다.
- Y[1..i]와 Y[i+1..n]가 모두 좋은 단어이며, X[1..i]는 Y[1..i]와 유사하고 X[i+1..n]는 Y[i+1..n]와 유사하다. 또는
- Y[1..n−i]와 Y[n−i+1..n]가 모두 좋은 단어이며, X[1..i]는 Y[n−i+1..n]와 유사하고 X[i+1..n]는 Y[1..n−i]와 유사하다.
비어 있지 않은 좋은 ab-단어들의 집합 S의 다양성 수준(level of diversity)은, 고른 어떤 두 단어도 서로 유사하지 않도록 S에서 고를 수 있는 단어의 최대 개수이다.
표준 입력에서 집합 S를 읽어 S의 다양성 수준을 계산하고, 그 결과를 표준 출력에 출력하는 프로그램을 작성하여라.