这天,小特生日。他的好朋友给他送来了生日礼物,这些礼物都经过精心包装放在若干个盒子里,而礼物就放在最里层的盒子里。朋友给他送的礼物遵循了这样一条规则, 越有价值的礼物应该放在越深的盒子里。他收到礼物后,急切地想知道这些礼物的价值,于是他把他收到的礼物写成括号的形式表示出来。具体他是这样计算他的礼物的价值的:
1.-对括号代表一个礼物盒子,盒子里面可以再放盒子,即括号里可以再放括号;若-对括号里没有括号,则代表里面放着礼物。
2.单独的一对括号代表这个礼物只有1层包装,价值为1 (比如"()"表示价值为1的礼物)
3.两个合法的括号序列的拼接而成的括号序列的价值是它们价值之和(比如"())"价值为1+1=2)
4.礼物每在盒子里放的层数深-层, 它的价值就会翻倍。即嵌套括号序列的价值是,所嵌套的括号序列的价值的翻倍(比如((0))"价值为1*2* 2=4)
根据小特判断礼物的规则,请告诉他,他所写的括号代表了多少价值的礼物。
小特保证他写的括号是正确合法的
Input
一个只包含'('和')'的合法的括号序列S,代表小特写下的括号序列,一个合法的括号序列是这样定义的:1、()是合法的括号序列
2、若字符串A和B是合法的括号序列,那么AB也是合法的括号序列
3、若字符串A是合法的括号序列,那么(A)也是合法的括号序列2<= ISI <=50
Output
一一个数字,代表小特所写的括号序列所代表的礼物的价值
Sample Input
(()(()))
Sample Output
6
代码:
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<math.h>
#include<string.h>
using namespace std;
stack<char> s;
char a[55];
int main()
{
int n,i,k,sum;
while(~scanf("%s",&a))
{
k=0,sum=0;
for(i=0;i<strlen(a);i++)
{
if(a[i]=='(')
{
s.push('(');
k++;
}
else if(a[i]==')')
{
k--;
if(s.top()=='(')
{
s.push(')');
sum+=pow(2,k);
//printf("%d\n",sum);
}
}
}
printf("%d\n",sum);
}
return 0;
}