题目

牛牛的记忆方法就是把单词的每个字母转换成数字,把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;
}