本题思路:将读入的字符串倒序操作并存入存答案的字符串里,最后逆序输出。
倒序操作的好处:有时候字母后面的数很大,逆序操作时,我们可以不断累加 10 10 10 的幂次数,再乘上该位上的数字。
如果一旦遇到字母,就停止累加 10 10 10 的幂指数,将所得数值总和不停做减法,每次减 1 1 1 就把这个字母加进存答案的字符串里。
注意:每次操作完后,要将 10 10 10 的幂指数归为 1 1 1,并将统计出的数值重新初始化为 0 0 0,而且还要做一个特判。
特判:当且仅当 A ≤ s i ≤ Z \texttt{A} \le s_{i} \le \texttt{Z} A≤si≤Z 且 A ≤ s i + 1 ≤ Z \texttt{A} \le s_{i + 1} \le \texttt{Z} A≤si+1≤Z,那么直接把这个字母加进存答案的字符串。(这是一个特殊情况,输出该字母的次数只有 1 1 1 次)
温馨提示:最后输出存答案的字符串一定要逆序输出 !!!( reverse \texttt{reverse} reverse 就是好用啊)
参考代码:
#include <bits/stdc++.h>
using namespace std;
int n, sum, t = 1;
string s, str;
int main () {
cin >> n;
for (int k = 1; k <= n; k ++) {
cin >> s;
for (int i = s.size() - 1; i >= 0; i --) {
if ( (s[i] >= 'A' && s[i] <= 'Z') && (s[i + 1] >= 'A' && s[i + 1] <= 'Z') ) str += s[i];//特判
if (s[i] >= '0' && s[i] <= '9') {
sum += t * (s[i] -'0');//累积数值总和
t *= 10;//累加10的幂次数
} else {
while(sum --) {
str += s[i];//存进存答案的字符串
}
t = 1, sum = 0;//重新初始化
}
}
reverse(str.begin(), str.end());//反转字符串
cout << "Case " << k << ": " << str << endl;
str = "";//清空存答案的字符串
}
return 0;
}