分析
单词记忆方法输入是一个字符串,含括号。那么这个时候我们就得思考我们的处理顺序。
1.
如果当前下标 i 是字符,毫无疑问,我们要将其加入到栈中,同时,因为其后可能跟着数字,所以从 i + 1 开始
求出其后的数字,与字符对应的数值相乘
if(s[i]>='A'&&s[i]<='Z')
{
ll now=s[i]-'A'+1,num=0;
while(s[i+1]>='0'&&s[i+1]<='9')
num=10*num+(s[i+1]-'0'),i++;
if(num<=0) num=1;
stk[tp]+=num*now;//是第tp个括号里的贡献
}
2.
如果这个时候是左括号,说明这个时候我们要新建一个,用于保存这个括号里的贡献
else if(s[i]=='(') stk[++tp]=0;
3.
如果是右括号,说明当前第 tp 个括号里的贡献可以合并到第 tp - 1 个括号里了,同时求出有括号右边是否有数值,
然后就可以合并了
else if(s[i]==')')
{
ll now=0;
while(s[i+1]>='0'&&s[i+1]<='9')
now=10*now+(s[i+1]-'0'),i++;
if(now<=0) now=1;
stk[tp]=now*stk[tp];
stk[tp-1]+=stk[tp];
tp--;
}
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int tp;
char s[N];
ll stk[N];
int main()
{
scanf("%s",s);
int len=strlen(s);
for (int i=0;i<len;i++)
{
if(s[i]>='A'&&s[i]<='Z')
{
ll now=s[i]-'A'+1,num=0;
while(s[i+1]>='0'&&s[i+1]<='9')
num=10*num+(s[i+1]-'0'),i++;
if(num<=0) num=1;
stk[tp]+=num*now;
}
else if(s[i]=='(') stk[++tp]=0;
else if(s[i]==')')
{
ll now=0;
while(s[i+1]>='0'&&s[i+1]<='9')
now=10*now+(s[i+1]-'0'),i++;
if(now<=0) now=1;
stk[tp]=now*stk[tp];
stk[tp-1]+=stk[tp];
tp--;
}
}
printf("%lld\n",stk[tp]);
return 0;
}