版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
小Y上数据结构课的时候摸鱼,听到老师在讲用栈做括号匹配,于是乎边随意写了一个合法的括号序列。但是光是写括号太无聊了,他现在想知道这个括号序列的价值。他是这样定义一个括号序列的价值的:
1、一对括号价值一分(比如"()“得一分)
2、两个合法的括号序列的拼接而成的括号序列的价值是他们的价值的和(比如”()()“价值为1+1=2)
3、嵌套的括号的序列的价值是,所嵌套的括号序列的价值的翻倍(比如”((()))"价值为122=4)
下课了,qz看到小Y写的括号序列,他一眼就推测出了规则并得到了括号序列的价值。那么问题来了,小Y写下的括号序列的价值是多少呢
输入
一个只包含’(‘和’)'的合法的括号序列S,代表小Y写下的括号序列,一个合法的括号序列是这样定义的:
1、()是合法的括号序列
2、若字符串A和B是合法的括号序列,那么AB也是合法的括号序列
3、若字符串A是合法的括号序列,那么(A)也是合法的括号序列
2<= |S| <=50
输出
一个字符串S,代表小Y所写的括号序列
输入样例
(()(()))
输出样例
6
模拟走一遍
添加个样例
输入:
()()()(())()((())(()(())())())
输出:
28
#include<bits/stdc++.h>
using namespace std;
char s[55];
stack<int>q;//( :200
int ans=0;
int main()
{
ios::sync_with_stdio(false);
cin>>s;
for(int i=0;i<strlen(s);i++)
{
//cout<<i<<" "<<s[i]<<endl;
if(s[i]=='(')
q.push(200);
else if(s[i]==')')
{
int tmp=q.top();
q.pop();
if(tmp==200)
q.push(1);
else
{
int t=q.top();
q.pop();
while(t!=200)
{
tmp+=t;
t=q.top();
q.pop();
}
q.push(tmp*2);
}
}
}
while(!q.empty())
{
ans+=q.top();
q.pop();
}
cout<<ans;
return 0;
}