만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

공통 괄호 문자열 사전

시간 제한5초메모리 제한1024 MB

요약
두 괄호 문자열 A, B와 자연수 K가 주어졌을 때, A와 B의 부분 문자열이면서 올바른 괄호 문자열인 것 중 사전순으로 K번째 문자열을 구합니다.
난이도

어려움10점 중 9점

유형
문자열 매칭, 문자열, 트라이
정답자
아직 제출이 없습니다

문제

(와 )만으로 이루어진 두 문자열 AA, BB와 자연수 KK가 주어진다.

AA의 부분 문자열이면서 BB의 부분 문자열이고, 올바른 괄호열인 서로 다른 문자열들의 집합을 S(A,B)S(A, B)라고 하자.

S(A,B)S(A, B)의 크기가 KK 이상인지 판별하고, 크기가 KK 이상이라면 S(A,B)S(A, B)를 사전 순으로 정렬했을 때 KK번째 문자열을 구하라.

하나의 입력 데이터에서 TT개의 테스트 케이스를 해결해야 한다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다.

다음 TT개의 각 줄에는 하나의 테스트 케이스가 주어진다. 두 문자열 AA와 BB, 자연수 KK가 공백 하나씩을 사이에 두고 차례로 적혀 있다.

출력

각 테스트 케이스마다 주어진 순서대로 한 줄에 답을 출력한다.

  • S(A,B)S(A, B)의 크기가 KK 미만이면 -1을 출력한다.
  • S(A,B)S(A, B)의 크기가 KK 이상이면 S(A,B)S(A, B)에서 사전 순 KK번째 문자열을 출력한다.

제한

  • 1≤T≤500 0001 \le T \le 500\,000
  • AA와 BB는 각각 여는 괄호와 닫는 괄호로만 이루어진 길이가 1 이상인 문자열이다.
  • 1≤K≤10181 \le K \le 10^{18}
  • ∑∣A∣≤500 000\sum |A| \le 500\,000
  • ∑∣B∣≤500 000\sum |B| \le 500\,000

∑∣A∣\sum |A|는 하나의 입력에서 주어지는 모든 AA의 길이 합이고, ∑∣B∣\sum |B|는 하나의 입력에서 주어지는 모든 BB의 길이 합이다.

힌트

올바른 괄호열의 정의

올바른 괄호열은 다음과 같이 정의한다.

  • 한 쌍의 괄호로만 이루어진 문자열 ()는 올바른 괄호열이다.
  • XX가 올바른 괄호열이면, XX를 괄호로 감싼 (X)도 올바른 괄호열이다.
  • XX와 YY가 올바른 괄호열이면, 두 문자열을 이어 붙인 XYXY도 올바른 괄호열이다.
  • 모든 올바른 괄호열은 위 세 가지 규칙을 통해서만 만들어진다.

예를 들어 (()(()))와 (())()()는 올바른 괄호열이지만, (()와 )((()()은 올바른 괄호열이 아니다.

부분 문자열의 정의

길이가 ll인 문자열 ss와 1≤i≤j≤l1 \le i \le j \le l인 두 정수 ii, jj에 대해, s[i..j]s[i..j]는 ss의 ii번째 문자부터 jj번째 문자까지를 순서대로 담은 문자열이다. 이런 문자열들을 ss의 부분 문자열이라고 한다.

예를 들어 ss가 ()(()()이면 s[1..5]s[1..5]는 (()이고, s[1..7]s[1..7]은 ()()이다. 따라서 (()과 ()()은 ()(()()의 부분 문자열이다. 하지만 )()(은 ()(()()의 부분 문자열이 아니다.

사전 순의 정의

길이가 l1l_1인 문자열 s1[1..l1]s_1[1..l_1]이 길이가 l2l_2인 문자열 s2[1..l2]s_2[1..l_2]보다 사전 순으로 앞선다는 것은 아래 두 조건 중 하나가 성립한다는 뜻이다.

  • s1s_1이 s2s_2의 접두사이다. 즉 l1<l2l_1 < l_2이고, 모든 1≤i≤l11 \le i \le l_1에 대해 s1[i]=s2[i]s_1[i] = s_2[i]이다.
  • 1≤i≤min⁡(l1,l2)1 \le i \le \min(l_1, l_2) 범위에서 s1[i]≠s2[i]s_1[i] \ne s_2[i]가 성립하는 가장 작은 ii에 대해 s1[i]<s2[i]s_1[i] < s_2[i]이다.

이 문제에서 여는 괄호 (는 닫는 괄호 )보다 사전에서 앞선 문자이다. 즉 ( < )이다.

이 방식은 C++, Java, Python에서 두 문자열을 비교하는 방식과 같다.

예제1

  1. 예제 1

    입력
    3
    ()((())) (()((())))() 3
    ))(()(((( )())))))( 1
    ())) )))))(()) 4
    
    예상 출력
    ()
    ()
    -1