괄호 뒤집기

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

요약
여는 괄호 N개와 닫는 괄호 N개로 이루어진 문자열이 주어질 때, 부분 문자열을 최소 횟수로 뒤집어 올바른 괄호 문자열로 만들고 그 뒤집기들을 출력한다.
난이도

보통10점 중 6점

유형
문자열, 그리디, 구현, 누적 합
정답자
아직 제출이 없습니다

문제

( NN개와 ) NN개로 이뤄진 괄호문자열 SS가 주어진다. 다음 시행을 최소로 하여 올바른 괄호문자열을 만들어라.

  • 1≤l≤r≤2N1 \leq l \leq r \leq 2N인 두 정수 ll, rr을 고른다. 이후 S_l,S_l+1,⋯ ,S_rS\_l, S\_{l+1}, \cdots , S\_r로 이뤄진 부분 문자열을 뒤집는다. 즉, S_l,S_l+1,⋯ ,S_rS\_l, S\_{l+1}, \cdots , S\_r을 각각 S_r,S_r−1,⋯ ,S_lS\_r, S\_{r-1}, \cdots , S\_l로 바꾼다.

올바른 괄호 문자열의 정의는 다음과 같다.

  1. 빈 문자열은 올바른 괄호 문자열이다.
  2. A가 올바른 괄호 문자열이라면, (A)도 올바른 괄호 문자열이다.
  3. A와 B가 올바른 괄호 문자열이라면, AB도 올바른 괄호 문자열이다.

입력

첫 번째 줄에 테스트 케이스의 개수 TT가 주어진다. (1≤T≤10 000)(1 \leq T \leq 10\ 000)

각 테스트 케이스의 첫 번째 줄에 정수 NN이 주어진다. (1≤N≤300 000)(1 \leq N \leq 300\ 000)

두 번째 줄에 ( NN개와 ) NN개로 이뤄진 문자열 SS가 주어진다.

모든 테스트 케이스에서 NN의 합은 300 000300\ 000을 넘지 않는다.

출력

각 테스트 케이스마다 첫 번째 줄에 필요한 시행의 최소 횟수 KK를 출력한다. 문제의 제약 조건 하에서 항상 K≤NK \leq N임을 보일 수 있다.

다음 KK개의 줄에 각 시행을 나타내는 두 정수 ll, rr을 공백으로 구분해 출력한다.

힌트

( 를 뒤집어도 )가 되지 않는다는 점을 유의하자.

예제1

  1. 예제 1

    입력
    2
    2
    (())
    3
    ()))((
    
    예상 출력
    0
    1
    2 6