올바른 괄호 구간

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

요약
문자열 앞뒤로 괄호를 계속 삽입하면서, 매 단계마다 새로 삽입된 문자를 포함하는 가장 짧은 올바른 괄호 부분 문자열의 길이를 구합니다.
난이도

어려움10점 중 8점

유형
스택, 문자열 매칭, 구현
정답자
아직 제출이 없습니다

문제

문자열은 네 종류의 괄호 문자 ()[]만으로 이루어진다.

괄호열이 다음 규칙으로 만들 수 있으면 올바른 괄호열이라고 한다.

  1. ()와 []는 올바른 괄호열이다.
  2. A가 올바른 괄호열이면 (A)와 [A]도 올바른 괄호열이다.
  3. A와 B가 올바른 괄호열이면 AB도 올바른 괄호열이다.

초기 괄호열이 주어진다. 이후 각 단계마다 괄호 하나가 현재 문자열의 맨 앞 또는 맨 뒤에 삽입된다.

각 단계가 끝날 때, 그 단계에서 새로 삽입한 괄호를 포함하는 연속 부분 문자열 중 올바른 괄호열인 것의 최소 길이를 구하라.

입력

첫째 줄에 초기 괄호열이 주어진다. 길이는 100,000 이하이다.

둘째 줄에 단계 수 N이 주어진다. (1 ≤ N ≤ 100,000)

다음 N개의 줄에는 정수 A와 문자 C가 공백 하나로 구분되어 주어진다. A가 0이면 C를 현재 문자열의 맨 앞에 삽입하고, A가 1이면 C를 맨 뒤에 삽입한다. C는 (, ), [, ] 중 하나이다.

출력

각 단계마다 한 줄에 답을 출력한다. 새로 삽입한 괄호를 포함하는 올바른 연속 부분 문자열이 없으면 0을 출력한다.

예제3

  1. 예제 1

    입력
    (
    1
    1 )
    
    예상 출력
    2
    
  2. 예제 2

    입력
    (]
    3
    1 )
    0 )
    0 (
    
    예상 출력
    0
    0
    2
    
  3. 예제 3

    입력
    [])
    3
    0 )
    0 (
    0 (
    
    예상 출력
    0
    2
    6