一个合法的括号序列满足以下条件:

  1. 序列()被认为是合法的。
  2. 如果序列X与Y是合法的,则XY也被认为是合法的。
  3. 如果序列X是合法的,则(X)也是合法的。

例如,(),()(),(())这些都是合法的。
现在,给定一个由 ( 和 ) 组成的字符串。
请你求出其中的最长合法括号子序列的长度。
注意,子序列不一定连续。

输入格式

共一行,一个由 ( 和 ) 组成的字符串。

输出格式

一个整数,表示最长合法括号子序列的长度。

数据范围

前五个测试点满足, 1≤输入字符串的长度≤101≤输入字符串的长度≤10。
所有测试点满足,1≤输入字符串的长度≤1061≤输入字符串的长度≤106。

输入样例1:

(()))(

输出样例1:

4

输入样例2:

()()(()(((

输出样例2:

6


  1. //合法括号序列两个条件 最后cnt = 0, 前缀序列中 cnt >= 0
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 1000010;
  6. char s[N];
  7. int main() {
  8. cin >> s;
  9. //l代表前缀序列中cnt,遇到(+1,遇到)-1
  10. int l = 0, r = 0;
  11. for (int i = 0; s[i]; ++i) {
  12. if (s[i] == '(') l++;
  13. else if (l > 0) {
  14. l--;
  15. r++;
  16. }
  17. }
  18. cout << r * 2 << endl;
  19. return 0;
  20. }