题目描述:传送门
题解:
做过最水的提高+省选-题。。。DP一下。对于每一个),找到和它匹配的(。考虑可以有(…)(…)(…)这种情况,我们只要再开一个DP数组维护累加一下就好了。。。
代码如下:
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
const int maxn=1000005;
int n,top,ans,sum,f[maxn],f1[maxn],stack[maxn];
char s[maxn];
int main(){
scanf("%s",s); n=strlen(s);
for (int i=0;i<n;i++){
f[i]=f1[i]=-1;
if (s[i]=='(') stack[++top]=i;
else {
if (!top) continue;
f1[i]=stack[top],top--;
if (f[f1[i]-1]!=-1) f[i]=min(f1[i],f[f1[i]-1]); else f[i]=f1[i];
if (i-f[i]+1>ans) ans=i-f[i]+1,sum=1; else if (i-f[i]+1==ans) sum++;
}
}
if (ans<2) printf("0 1\n"); else printf("%d %d\n",ans,sum);
return 0;
}