Bracket Sequence Endgame

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

요약
S에서 올바른 괄호 부분 문자열을 뒤집는 연산을 반복해 만들 수 있는 서로 다른 괄호 문자열의 개수를 998244353으로 나눈 나머지를 구한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 조합론, 문자열, 수학
정답자
아직 제출이 없습니다

문제

각 문자가(, )로만 이루어진 문자열을 괄호 문자열이라고 한다. 이때, 올바른 괄호 문자열의 정의는 다음과 같다.

  • ()은 올바른 괄호 문자열이다.
  • AA가 올바른 괄호 문자열일 때, (AA)는 올바른 괄호 문자열이다.
  • AA, BB가 각각 올바른 괄호 문자열일 때, ABAB는 올바른 괄호 문자열이다.

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

괄호 문자열 SS가 주어진다. 당신은 이 괄호 문자열에 다음 연산을 원하는 만큼 시행할 수 있다.

  1. 현재 문자열을 TT라고 하자. 당신은 올바른 괄호 문자열인 T\[l,r]T\[l,r]을 선택한다. 이는 TT의 ll번째부터 rr번째의 문자들로 이루어진 부분 문자열을 의미한다. (1≤l≤r≤N1 \leq l \leq r \leq N)
  2. l≤i≤rl \leq i \leq r인 모든 ii에 대해 T_i=T\_i =(이라면 )로 바꾸고, T_i=T\_i =)이라면 (로 바꾼다.

당신은 시작 괄호 문자열 SS로부터 연산을 원하는 만큼 진행하여 만들 수 있는 서로 다른 괄호 문자열의 개수가 궁금해졌다. 두 괄호 문자열이 다른 과정을 통해 같은 괄호 문자열이 되었을 때도 하나의 괄호 문자열로 인정됨에 주의하라.

입력

첫째 줄에 괄호 문자열의 길이 NN이 주어진다. (1≤N≤5,0001 \leq N \leq 5\\,000)

둘째 줄에 괄호 문자열 SS가 주어진다.

출력

연산을 시행하여 만들 수 있는 서로 다른 괄호 문자열의 개수를 998,244,353998\\,244\\,353으로 나눈 나머지를 출력하라.

예제3

  1. 예제 1

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

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

    입력
    12
    )(()()()))()
    
    예상 출력
    317