单词记忆方法
单词记忆方法
https://ac.nowcoder.com/acm/problem/212154
题目
牛牛的记忆方法就是把单词的每个字母转换成数字,把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; }