• 分析

    单词记忆方法

    输入是一个字符串,含括号。那么这个时候我们就得思考我们的处理顺序。


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;
}