5C:Longest Regular Bracket Sequence
题意简述
给出一个包含()
的字符串。
输出最长的合法括号匹配子串的长度,和这样的串的个数。
如果没有输出0 1
数据范围
1≤len≤106
思路
DP。
g[i]
表示和
i
这个右括号匹配的左括号的位置。
用一个栈来模拟括号匹配。
遇到左括号就入栈,右括号出栈。
如果出栈是为空栈就令
否则
g[i]=stack.top(),f[i]=min(g[i],f[g[i−1]−1])
代码
#include<cstdio>
#include<cstring>
using namespace std;
char st[1000010];
int sta[1000010],f[1000010],g[1000010];
int tail,ans,num=1,len;
int main()
{
scanf("%s",st);
len=strlen(st);
memset(f,0xff,sizeof(f));
memset(g,0xff,sizeof(g));
for (int i=0;i<len;i++)
if (st[i]=='(')
sta[tail++]=i;
else
{
if (tail!=0)
{
f[i]=sta[tail-1];
g[i]=sta[--tail];
if (f[g[i]-1]!=-1)
f[i]=f[g[i]-1];
if (i-f[i]+1>ans)
ans=i-f[i]+1,num=1;
else if (i-f[i]+1==ans)
num++;
}
}
printf("%d %d",ans,num);
return 0;
}