[CF5C]Longest Regular Bracket Sequence

来源:互联网 发布:商陆花软件价格 编辑:程序博客网 时间:2024/06/05 00:42

5C:Longest Regular Bracket Sequence

题意简述

给出一个包含()的字符串。
输出最长的合法括号匹配子串的长度,和这样的串的个数。
如果没有输出0 1

数据范围

1len106

思路

DP。
g[i]表示和i这个右括号匹配的左括号的位置。
f[i]表示以i这个右括号为结尾最早的合法位置。
用一个栈来模拟括号匹配。
遇到左括号就入栈,右括号出栈。
如果出栈是为空栈就令f[i]=g[i]=1
否则g[i]=stack.top(),f[i]=min(g[i],f[g[i1]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;}
0 0
原创粉丝点击