51NOD 1791 合法括号子段

来源:互联网 发布:在淘宝上买摩托车 编辑:程序博客网 时间:2024/06/05 07:27

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1791

用一个栈来维护,碰到左括号入栈,碰到右括号出栈,
出栈规则:栈顶不为左括号或者已出栈的右括号大于左括号。
循环完了再把栈里剩余的处理一遍。

#include<bits/stdc++.h>using namespace std;string s;long long fc(long long k){    return k*(k+1)/2;}int main(){    long long t;    cin>>t;    while(t--)    {        string s;        cin>>s;        stack<char> st;        long long l,r;        l=r=0;        long long ans=0;        for(long long i=0; i<s.size(); i++) {            if(s[i]=='(') st.push('(');            else {                long long cnt=0;                long long sum=0;                while(!st.empty()&&(st.top()!='('||cnt>0))                {                //    cout<<st.top()<<endl;                    if(st.top()==')') cnt++,sum++;                    else cnt--;                    st.pop();                }                if(!st.empty())                st.push(')');                ans+=fc(sum);            }        }        l=r=0;        while(!st.empty()) {            if(st.top()==')') r++;            else l++;            if(l>r) {                ans+=fc(r);                r=0;                l=0;            }            st.pop();        }        ans+=fc(r);        cout<<ans<<endl;    }}
原创粉丝点击