站外题求助
  • 板块题目总版
  • 楼主dalu
  • 当前回复12
  • 已保存回复13
  • 发布时间2025/1/8 09:26
  • 上次更新2025/1/8 18:31:55
查看原帖
站外题求助
1416993
dalu楼主2025/1/8 09:26

前缀计算

题目描述

给定一个前缀表达式,求其运算结果对 109+710^9 + 7 取模后的结果

保证该前缀表达式中每个运算数均为正整数且不超过 10910^9,每个正整数前边均会有一个 # 表示该正整数从这里开始,该前缀表达式的运算符仅含有加号(+),减号(-),乘号(*

该前缀表达式中的正整数不超过 2×1052 \times 10^5 个,字符串总长度不超过 3×1063 \times 10^6

输入格式

输入一行,包含一个字符串,为一个前缀表达式

输出格式

输出一行,包含一个非负整数,表示该前缀表达式运算结果对 109+710^9 + 7 取模后的结果

样例 #1

样例输入 #1

-*+#1#2#3#4

样例输出 #1

5

提示

数据范围

对于 30%30\% 的数据,该前缀表达式中的正整数不超过 200200 个,字符串总长度不超过 3×1033 \times 10^3

对于另外 20%20\% 的数据,表达式中不含减号

对于另外 20%20\% 的数据,表达式中不含乘号

对于 100%100\% 的数据,该前缀表达式中的正整数不超过 2×1052 \times 10^5 个,字符串总长度不超过 3×1063 \times 10^6

我WA0分,code

#include <iostream>
#include <stack>
#include <algorithm>
#define mod 1000000007
using namespace std;

string s;
stack < long long > st;
long long x,a,b;

int main(){
    cin >> s;
    reverse(s.begin(),s.end());
    for(int i = 0;i < s.size();i++){
        if(s[i] == '#'){
            st.push(x);
            x = 0;
            continue;
        }
        if(isdigit(s[i])){
            x = (x << 3) + (x << 1) + (s[i] ^ 48);
            x %= mod;
            continue;
        }
        switch(s[i]){
        case '+':a = st.top();st.pop();b = st.top();st.pop();st.push((a + b) % mod);break;
        case '-':a = st.top();st.pop();b = st.top();st.pop();st.push((a - b) % mod);break;
        case '*':a = st.top();st.pop();b = st.top();st.pop();st.push((a * b) % mod);break;
        }
    }
    cout << st.top();
    return 0;
}
2025/1/8 09:26
加载中...