서로 다른 올바른 괄호 부분 문자열 세기

길이가 100 이하인 괄호 문자열이 주어질 때, 부분수열로 나타나는 서로 다른 비어 있지 않은 올바른 괄호 문자열의 개수를 1,000,000,007로 나눈 나머지로 구한다.

보통7동적 계획법문자열조합론구현아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

올바른 괄호 문자열은 다음과 같이 재귀적으로 정의된다.

  • 빈 문자열 ""는 올바른 괄호 문자열이다.
  • XXYY가 올바른 괄호 문자열이면 XYXY도 올바른 괄호 문자열이다.
  • XX가 올바른 괄호 문자열이면 (X)(X)도 올바른 괄호 문자열이다.
  • 올바른 괄호 문자열은 모두 위 규칙으로 만들 수 있다.

"()", "()()()", "(()())", "(((())))"는 모두 올바른 괄호 문자열이다.

문자열 TT가 문자열 SS의 부분 문자열이라는 말은, SS에서 문자 몇 개를 지워서 TT를 만들 수 있다는 뜻이다. 하나도 지우지 않거나 전부 지워도 된다. 남은 문자의 순서는 바꾸지 않는다. 예를 들어 "bdf"는 "abcdefg"의 부분 문자열이다.

'('와 ')'로만 이루어진 문자열 SS가 주어진다. SS의 비어 있지 않은 부분 문자열 중에서 서로 다른 올바른 괄호 문자열이 몇 개인지 구하는 프로그램을 작성하시오. 지운 위치가 달라도 같은 문자열이 되면 하나로 센다.

입력

첫째 줄에 문자열 SS가 주어진다. SS는 '('와 ')'로만 이루어져 있고, 길이는 11 이상 100100 이하이다.

출력

첫째 줄에 SS의 비어 있지 않은 부분 문자열 중에서 서로 다른 올바른 괄호 문자열의 개수를 1,000,000,007로 나눈 나머지를 출력한다.