아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

부분 문자열 표현

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

요약
트리 문자열에서 연속된 한 부분을 제거한 뒤에도 트리 문자열로 남는 경우의 수를 센다.
난이도

보통10점 중 7점

유형
문자열, 스택, 트리, 조합론
정답자
아직 제출이 없습니다

문제

트리는 때때로 문자열의 형태로 표현된다. 레이블이 없는 트리를 표현하는 가장 널리 쓰이는 방법 중 하나는 다음과 같다.

  • 잎은 "()"로 표현한다.
  • 잎이 아닌 노드, 즉 내부 노드는 ( S1 S2 ... Sn )으로 표현한다. 여기서 Si는 i번째 자식 노드를 나타내는 문자열이다.

예를 들어 아래 그림의 트리는 문자열 "((()())())"로 표현된다.

Norward라는 별난 소년이 이런 문자열을 가지고 논다. 그는 문자열에서 연속한 일부분을 하나 제거한 뒤에도 그 문자열이 트리의 표현으로 여전히 올바른 경우가 있다는 것을 알아냈다. 예를 들어 문자열 "((()())())"에서 밑줄 친 부분을 제거하면 "((()))"가 되고, 이는 아래 그림의 트리를 나타낸다.

하지만 그는 이런 제거 방법이 몇 가지인지 알 방법이 없다. 당신의 과제는 그의 호기심을 채워 줄 프로그램을 작성하는 것이다.

입력

입력은 레이블이 없는 어떤 트리를 나타내는 문자열 하나로 이루어진다. 문자열의 길이는 최대 100,000자이다.

출력

주어진 문자열에서 일부분을 제거했을 때 다른 올바른 트리를 나타내는 문자열이 되는 그러한 부분의 개수를 출력한다.

예제1

  1. 예제 1

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