codeforcres 5C Longest Regular Bracket Sequence 队列优化 栈

做法:用个栈就过了,然后数组l[i]记录,以这个点为终点的最长括号序列。明白什么是字串啊....

#include <iostream>
#include <utility>
#include <stack>
#include <cstdio>
#define LMT 1000003
using namespace std;
int len,ans;
char bra[LMT];
int l[LMT];
//没有考虑到连续 ()()()()
int main()
{
    len=-1;ans=0;
    int bl,pre,prel;
    scanf("%s",bra);
    stack < pair<char,int> > st;
    pair<char,int> t;
    for(int i=0;bra[i];i++)
    {

        if(!st.empty())
        t=st.top();
        if(!st.empty()&&t.first=='('&&bra[i]==')')
        {
            st.pop();
            bl=i-t.second+1;
            bl+=l[t.second-1];
            l[i]=bl;
            if(bl>len)
            {
                ans=1;
                len=bl;
            }
            else if(bl==len)
                ans++;
        }
        else st.push(make_pair(bra[i],i));
    }
    if(ans==0)printf("0 1\n");
    else printf("%d %d\n",len,ans);
    return 0;
}


你可能感兴趣的:(codeforcres 5C Longest Regular Bracket Sequence 队列优化 栈)