Codeforces5C

直接开个栈,遇到左括号把左括号的位置入栈

那么遇到右括号位置是 i i i的时候,把栈顶的一个左括号 j j j取出来

那么说明 [ j , i ] [j,i] [j,i]一定是合法的

所以可以进行 d p dp dp

d p [ i ] = ( i − j + 1 ) + d p [ j − 1 ] dp[i]=(i-j+1)+dp[j-1] dp[i]=(ij+1)+dp[j1]

因为 [ j , i ] [j,i] [j,i]位置的前面可以接上以 j − 1 j-1 j1结尾的最长合法串

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
int n,a[maxn],ans,num,dp[maxn],q[maxn],top;
char s[maxn];
int main()
{
	scanf("%s",s+1);
	n=strlen(s+1);
	for(int i=1;i<=n;i++)
	{
		if( s[i]=='(' )	dp[i]=0,q[++top]=i;
		else
		{
			if( top )	dp[i] = dp[q[top]-1]+( i-q[top--]+1 );
			else	dp[i] = 0;
		}
		if( dp[i]>ans )	ans=dp[i],num=1;
		else if( dp[i]==ans )	num++;
	}
	if( ans==0 )	num=1;
	cout << ans << " " << num;
}