题面 : https://codeforces.com/contest/5/problem/C
题意 : 给一个由"("和")"组成的字符串,让你找最长匹配合法子串还有其出现的次数。
题解 : 因为要找的是一个连续的子串,所以有一个性质,就是子串中每一个左右括号匹配的另一半和原串中匹配的要么相同;要么就是原串有,子串中没有另一半;要么就是都没有。所以直接用栈维护原串,找出原串中有哪些有另一半,这些括号就是合法括号,标记成1。然后找最长为1的串还有其出现次数即可。
像我这种菜鸡就是想不到QAQ
#include<bits/stdc++.h>
using namespace std;
char s[1000010];
int f[1000010],STACK[1000010];
int main()
{
int n,i,top=0,ans1=0,ans2=0;
scanf("%s",s+1);
n=strlen(s+1);
top=0;
for(i=1;i<=n;i++)
{
if(s[i]=='(')
{
STACK[++top]=i;
}
else
{
if(top>0&&s[STACK[top]]=='(')
{
f[i]=f[STACK[top]]=1;
top--;
}
else
{
STACK[++top]=i;
}
}
}
ans1=0;
for(i=1;i<=n;i++)
{
if(f[i]!=0)f[i]+=f[i-1];
ans1=max(ans1,f[i]);
}
ans2=0;
for(i=1;i<=n;i++)if(f[i]==ans1)ans2++;
if(ans1==0)printf("0 1");
else printf("%d %d",ans1,ans2);
return 0;
}