小 R 在整理一本可以左右折叠的笔记。她用字符 ( 表示“向左打开一层折页”,用字符 ) 表示“合上一层折页”。一段连续的折页记录是完整的,当且仅当每一次合上都能对应到此前某一次尚未合上的打开,并且最后所有打开都被合上。
形式化地,合法片段就是一个合法括号串。例如 ()()、(())、(()()) 都是合法片段,而 )(、(()、())( 都不是。
给定一个只包含 ( 和 ) 的字符串 S。请你求出 S 中有多少个连续子串是合法片段。
注意:如果两个合法片段出现的位置不同,即使它们的内容完全相同,也要分别计数。
输入一行一个字符串 S。
输出一行一个整数,表示 S 中合法片段的数量。
()(())
4
())(())()
5
(()())())(()(()))
11
对于样例 1,合法片段共有 4 个:
();(());();()(())。因此输出 4。
样例 2 中,第 3 位的 ) 会把字符串分成两段,合法片段不能跨过这个位置。
对于所有测试数据,保证:
( 和 ) 组成。本题共 10 个测试点,每个测试点 10 分。
| 测试点编号 | \lvert S\rvert \le | 特殊性质 |
|---|---|---|
| 1 \sim 2 | 30 | 无 |
| 3 \sim 5 | 50 | 无 |
| 6,8 | 10^4 | A |
| 7 | 10^4 | AB |
| 9 \sim 10 | 10^6 | 无 |
特殊性质 A:每个位置到它之前的所有位置组成的前缀中,左括号数量始终不少于右括号数量。
特殊性质 B:S 形如 ()()...(),即由若干个 () 连续拼接而成。