首页 > 代码库 > CodeForces - 5C Longest Regular Bracket Sequence

CodeForces - 5C Longest Regular Bracket Sequence

This is yet another problem dealing with regular bracket sequences.

We should remind you that a bracket sequence is called regular, if by inserting ?+? and ?1? into it we can get a correct mathematical expression. For example, sequences ?(())()?, ?()? and ?(()(()))? are regular, while ?)(?, ?(()? and ?(()))(? are not.

You are given a string of ?(? and ?)? characters. You are to find its longest substring that is a regular bracket sequence. You are to find the number of such substrings as well.

Input

The first line of the input file contains a non-empty string, consisting of ?(? and ?)? characters. Its length does not exceed 106.

Output

Print the length of the longest substring that is a regular bracket sequence, and the number of such substrings. If there are no such substrings, write the only line containing "0 1".

Example

Input
)((())))(()())
Output
6 2
Input
))(
Output
0 1
 1 #include<iostream>
 2 #include<string.h>
 3 #include<cstdio>
 4 #include<stack>
 5 
 6 using namespace std;
 7 
 8 char s[1000005];
 9 int dp[1000005];
10 stack<int> st;
11 
12 int main()
13 {
14     scanf("%s",s);
15     int ans=0,maxx=0,i,l=strlen(s);
16     for(i=0;i<l;++i)
17     {
18         if(s[i]==()
19             st.push(i);
20             else
21             {
22                 if(!st.empty())
23                 {
24                     int t=st.top();
25                     st.pop();
26                     dp[i]=dp[t-1]+i-t+1;
27                     if(dp[i]>maxx)
28                     {
29                         maxx=dp[i];
30                         ans=1;
31                     }
32                     else if(dp[i]==maxx) 
33                         ans++;
34                 }
35             }
36     }
37     if(!maxx) 
38         ans=1;
39     printf("%d %d\n",maxx,ans);
40     
41     return 0;
42 }

 

CodeForces - 5C Longest Regular Bracket Sequence