牛客小白月赛28 G-单词记忆方法

单词记忆方法

https://ac.nowcoder.com/acm/contest/7412/C

  • 分析

    单词记忆方法

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


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;
}
比赛题解 文章被收录于专栏

牛客IOI周赛,团队赛,练习赛,挑战赛,各种模拟赛的部分题解

全部评论

相关推荐

想玩飞盘的菠萝蜜在春...:上交✌🏻也拒?
点赞 评论 收藏
分享
爱吃烤肠的牛油最喜欢...:50K是ssp了估计,ssp的人家多厉害都不用说,每年比例大概在百分之5左右
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务