아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

가장 짧은 허용 문자열

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

요약
a, b, c와 $로 이루어진 정규 표현식을 트리로 파싱한 뒤, 각 노드가 받아들이는 가장 짧고 사전순으로 가장 작은 문자열을 계산한다.
난이도

보통10점 중 7점

유형
동적 계획법, 문자열, 재귀, 구현
정답자
아직 제출이 없습니다

문제

이 문제에서는 알파벳 소문자 "a", "b", "c"로 이루어진 문자열을 다룬다.

정규 표현식을 다음과 같이 재귀적으로 정의한다.

  1. 한 문자 "$"는 빈 문자열을 허용하는 정규 표현식이다.
  2. 한 문자 "a", "b", "c"는 각각 문자열 "a", "b", "c"를 허용하는 정규 표현식이다.
  3. PP가 정규 표현식이면 "( PP )"도 정규 표현식이고, PP가 허용하는 모든 문자열을 허용한다.
  4. PP가 규칙 1--4 중 하나를 적용한 직접 결과인 정규 표현식이면, 그 반복 "PP *"도 정규 표현식이고, kk가 음이 아닌 정수일 때 s=u1u2…uks = u_1 u_2 \ldots u_k (0개 이상의 문자열을 이어 붙인 것) 꼴의 문자열을 허용한다. 여기서 각 문자열 uiu_i는 PP가 허용한다.
  5. PP와 QQ가 규칙 1--5 중 하나를 적용한 직접 결과인 정규 표현식이면, 그 연결 "PP {} QQ"도 정규 표현식이고, s=uvs = u v (uu와 vv를 이어 붙인 것이며 각각은 빈 문자열일 수 있다) 꼴의 문자열을 허용한다. 여기서 접두사 uu는 PP가 허용하고 접미사 vv는 QQ가 허용한다.
  6. PP와 QQ가 규칙 1--6 중 하나를 적용한 직접 결과인 정규 표현식이면, 그 합집합 "PP | QQ"도 정규 표현식이고, PP가 허용하는 문자열과 QQ가 허용하는 문자열을 모두 허용한다.

규칙 4--6의 제한은 모호함을 없애고 연산의 우선순위를 정하기 위해 두었다. 정규 표현식을 읽을 때는 반복, 연결, 합집합 순으로 계산한다. 괄호는 안에 묶인 연산의 우선순위를 높이는 통상적인 역할을 한다. 예를 들어 정규 표현식 "a(bac|ac*)"는 "a 다음에 (b 다음에 a 다음에 c) 또는 (a 다음에 c가 0개 이상)"를 허용하는 것으로 읽는다.

정규 표현식 rr이 주어질 때, 이 정규 표현식 rr이 허용하는 가장 짧은 문자열 ss를 구하라. 그러한 문자열이 여러 개라면 사전 순으로 가장 작은 것을 구하라.

입력

첫째 줄에 테스트 케이스의 수 TT가 주어진다 (1≤T≤3001 \le T \le 300).

다음 TT개 줄에 각각 하나의 테스트 케이스가 주어진다. 각 테스트 케이스는 위 규칙으로 구성된 문자열인 정규 표현식 rr 하나로 이루어진다. 길이는 1자 이상 300자 이하이다.

모든 정규 표현식의 길이 합은 300 이하이다.

출력

각 테스트 케이스마다 주어진 정규 표현식 rr이 허용하는 가장 짧은 문자열을 한 줄에 출력한다. 그러한 문자열이 여러 개라면 사전 순으로 가장 작은 것을 출력한다.

답이 빈 문자열이면 대신 한 문자 "$"를 출력한다.

예제1

  1. 예제 1

    입력
    3
    a
    ab|ac*(ca|cb)
    ((ab|ac)a)*
    
    예상 출력
    a
    ab
    $