题目
牛牛的记忆方法就是把单词的每个字母转换成数字,把A看成1,B看成2,C看成3,依次类推,然后计算出来这个单词每个字母的和。从此每次想到这个单词,就要先想到这个单词的和,然后想办法凑出这个和。
不久后,牛牛又对自己的记忆方法进行了更新,可以把重复的连续字母进行合并,
比如把 ABCABC 写成 (ABC)2,HHHH 写成 (H2)2 或者 H4,这样计算和的时候只需要用里面的和乘个数就可以了,更加方便。(但是有时候牛牛由于老花眼没有发现几个相同的连续字母是重复的,所以导致他没进行合并)
牛牛告诉你一个单词,这个单词可能很长甚至你从来没见过,但牛牛要你按他的方法算出这个单词的和。
解题思路
使用栈保存每次计算的数值。
将每个括号内的数据作为一层。从内到外计算单词的和。
每遇到一个左括号,sta.push(0),这是新的一层。
如果遇到一个右括号,计算括号后的数字,将 sta 最顶层的和乘以这个数字,这一层就计算完成,将得到的数值累加到外层的和。
如果遇到字母,同上处理。
C++代码
#include<iostream>
#include<stack>
using namespace std;
int main(){
string s;
cin >> s;
long long ans = 0;
int i = 0;
stack<long long> sta;
sta.push(0);
while(i<s.size()){
if(s[i]=='('){
sta.push(0);
++i;
}
else{
long long a = 0;
if(s[i]==')'){
a = sta.top();
sta.pop();
}
else if(s[i]>='A' && s[i]<='Z'){
a = s[i]-'A'+1;
}
++i;
string sd = "";
while(i<s.size() && s[i]>='0' && s[i]<='9'){
sd += s[i];
++i;
}
if(sd!=""){
long long m = stoll(sd);
a *= m;
}
long long b = sta.top();
sta.pop();
sta.push(a+b);
}
}
cout << sta.top() << endl;
return 0;
} 
京公网安备 11010502036488号