만드는 중입니다

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

괄호 부분 문자열

시간 제한2초메모리 제한512 MB

요약
길이 500,000 이하의 괄호 문자열이 주어질 때, 부분 문자열 중 서로 다른 올바른 괄호 문자열의 개수를 센다.
난이도

어려움10점 중 9점

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

문제

괄호 문자열은 다음과 같이 정의한다.

  1. 빈 문자열은 괄호 문자열이다.
  2. SS가 괄호 문자열이면 (S)(S)도 괄호 문자열이다.
  3. SS와 TT가 괄호 문자열이면 STST도 괄호 문자열이다.
  4. 괄호 문자열은 위 세 규칙으로만 만들어진다.

예를 들어 ()()와 ((()))(())는 괄호 문자열이고, )((), (((((, ())는 괄호 문자열이 아니다.

문자열 SS가 주어지면 SS의 부분 문자열 중 괄호 문자열인 것이 몇 종류인지 세는 프로그램을 작성하시오. 부분 문자열은 SS에서 연속한 구간을 잘라낸 문자열이고, 빈 문자열은 세지 않는다. 같은 문자열이 여러 위치에 나타나도 한 번만 센다.

입력

첫째 줄에 문자열의 길이 NN (1≤N≤500,0001 \le N \le 500{,}000)이 주어진다.

둘째 줄에 문자열 SS가 주어진다. SS의 길이는 NN이고, 여는 괄호 (와 닫는 괄호 )로만 이루어져 있다.

출력

첫째 줄에 SS의 부분 문자열 중 서로 다른 괄호 문자열의 개수를 출력한다.

예제4

  1. 예제 1

    입력
    10
    ()()()()()
    
    예상 출력
    5
    
  2. 예제 2

    입력
    7
    )(())()
    
    예상 출력
    3
    
  3. 예제 3

    입력
    1
    (
    
    예상 출력
    0
    
  4. 예제 4

    입력
    10
    ((((()))))
    
    예상 출력
    5