#S0010. 括号序列(bracket)

括号序列(bracket)

题目描述

给一个由左右括号构成的字符串 SS,对于每一个位置 ii,输出有多少个子串,满足这个子串是一个合法的括号序列,并且这个位置在子串中。

其中合法的括号序列定义如下:

  • 空串是合法的。
  • 如果 SS 是合法的,那么 (S)(S) 也是合法的。
  • 如果 U,VU,V 是合法的,那么 UVUV 也是合法的。

输入格式

从文件 bracket.in 中读入数据。

一行,一个由左右括号构成的字符串 SS。

输出格式

将答案输出到文件 bracket.out 中。

由于答案可能很大,输出

∑(i×ansi(mod109+7))\sum (i \times ans_i \pmod{10^9+7})

即可,其中 ansians_i 表示第 ii 个位置的答案。注意这里我们要先取模,再相加。

样例

(()())
49

样例 2 输入输出

见下发文件。

样例解释

样例 1 中,ansans 分别为 1,3,3,3,3,11,3,3,3,3,1。

数据范围

共十组数据。

对于 30%30\% 的数据,保证 ∣S∣≤5000|S| \le 5000。

对于 70%70\% 的数据,保证 ∣S∣≤106|S| \le 10^6。

对于 100%100\% 的数据,保证 ∣S∣≤107|S| \le 10^7。