공통 괄호 문자열 사전
시간 제한5초메모리 제한1024 MB
두 괄호 문자열 A, B와 자연수 K가 주어졌을 때, A와 B의 부분 문자열이면서 올바른 괄호 문자열인 것 중 사전순으로 K번째 문자열을 구합니다.
문제
(와 )만으로 이루어진 두 문자열 , 와 자연수 가 주어진다.
의 부분 문자열이면서 의 부분 문자열이고, 올바른 괄호열인 서로 다른 문자열들의 집합을 라고 하자.
의 크기가 이상인지 판별하고, 크기가 이상이라면 를 사전 순으로 정렬했을 때 번째 문자열을 구하라.
하나의 입력 데이터에서 개의 테스트 케이스를 해결해야 한다.
입력
첫째 줄에 테스트 케이스의 개수 가 주어진다.
다음 개의 각 줄에는 하나의 테스트 케이스가 주어진다. 두 문자열 와 , 자연수 가 공백 하나씩을 사이에 두고 차례로 적혀 있다.
출력
각 테스트 케이스마다 주어진 순서대로 한 줄에 답을 출력한다.
- 의 크기가 미만이면 -1을 출력한다.
- 의 크기가 이상이면 에서 사전 순 번째 문자열을 출력한다.
제한
- 와 는 각각 여는 괄호와 닫는 괄호로만 이루어진 길이가 1 이상인 문자열이다.
는 하나의 입력에서 주어지는 모든 의 길이 합이고, 는 하나의 입력에서 주어지는 모든 의 길이 합이다.
힌트
올바른 괄호열의 정의
올바른 괄호열은 다음과 같이 정의한다.
- 한 쌍의 괄호로만 이루어진 문자열
()는 올바른 괄호열이다. - 가 올바른 괄호열이면, 를 괄호로 감싼
(X)도 올바른 괄호열이다. - 와 가 올바른 괄호열이면, 두 문자열을 이어 붙인 도 올바른 괄호열이다.
- 모든 올바른 괄호열은 위 세 가지 규칙을 통해서만 만들어진다.
예를 들어 (()(()))와 (())()()는 올바른 괄호열이지만, (()와 )((()()은 올바른 괄호열이 아니다.
부분 문자열의 정의
길이가 인 문자열 와 인 두 정수 , 에 대해, 는 의 번째 문자부터 번째 문자까지를 순서대로 담은 문자열이다. 이런 문자열들을 의 부분 문자열이라고 한다.
예를 들어 가 ()(()()이면 는 (()이고, 은 ()()이다. 따라서 (()과 ()()은 ()(()()의 부분 문자열이다. 하지만 )()(은 ()(()()의 부분 문자열이 아니다.
사전 순의 정의
길이가 인 문자열 이 길이가 인 문자열 보다 사전 순으로 앞선다는 것은 아래 두 조건 중 하나가 성립한다는 뜻이다.
- 이 의 접두사이다. 즉 이고, 모든 에 대해 이다.
- 범위에서 가 성립하는 가장 작은 에 대해 이다.
이 문제에서 여는 괄호 (는 닫는 괄호 )보다 사전에서 앞선 문자이다. 즉 ( < )이다.
이 방식은 C++, Java, Python에서 두 문자열을 비교하는 방식과 같다.