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;
}
}