![]()
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1e6+5;
4 int dp[N];//dp[i]表示以i结尾的最长合法串长度; dp[i]转移,考虑当前i为')' 栈里只压入'('则dp[i]=dp[j-1]+i-j+1;j-1如果合法那么可以合并
5 int main()
6 {
7 string s;
8 cin>>s;
9 int ans=0,cnt=1;
10 stack<int>st;
11 int n=s.size();
12 memset(dp,0,sizeof(dp));
13 for(int i=0;i<n;i++)
14 {
15 if(s[i]=='(')st.push(i);
16 else
17 {
18 if(st.size())
19 {
20 int j=st.top();
21 st.pop();
22 dp[i]=dp[j-1]+i-j+1;
23 if(dp[i]==ans)cnt++;
24 else if(dp[i]>ans)
25 {
26 ans=dp[i];
27 cnt=1;
28 }
29 }
30 }
31 }
32 cout<<ans<<" "<<cnt;
33 return 0;
34 }