您的位置:首页 > 其它

51NOD 1791 合法括号子段

2017-10-27 00:52 323 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: