結果
| 問題 | No.708 (+ー)の式 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2022-11-24 22:43:47 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 2 ms / 2,000 ms | 
| コード長 | 2,217 bytes | 
| コンパイル時間 | 1,783 ms | 
| コンパイル使用メモリ | 175,420 KB | 
| 実行使用メモリ | 6,824 KB | 
| 最終ジャッジ日時 | 2024-10-01 10:59:33 | 
| 合計ジャッジ時間 | 2,507 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 12 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
long long eval(string s){
    int n = s.size();
    vector<string> st;
    st.push_back("0");
    bool prenum = true;
    for(int i = 0; i < s.size(); i++){
        if('0' <= s[i] && s[i] <= '9'){
            if(prenum){
                st.back() += s[i];
            }else{
                st.push_back(s.substr(i, 1));
            }
            prenum = true;
        }else{
            while(st.size() >= 3 && (st.rbegin()[1] == "*" || st.rbegin()[1] == "/")){
                bool mul_flag = st.rbegin()[1] == "*";
                long long v1 = stoll(st.rbegin()[2]);
                long long v2 = stoll(st.rbegin()[0]);
                st.pop_back();st.pop_back();st.pop_back();
                if(mul_flag)st.push_back(to_string(v1 * v2));
                else st.push_back(to_string(v1 / v2));
            }
            if(s[i] == ')'){
                long long p = 0, m = 0;
                while(st.back() != "("){
                    if(st.rbegin()[1] == "+"){
                        p += stoll(st.back());
                        st.pop_back();st.pop_back();
                    }else if(st.rbegin()[1] == "-"){
                        m += stoll(st.back());
                        st.pop_back();st.pop_back();
                    }else{
                        p += stoll(st.back());
                        st.pop_back();
                    }
                }
                st.back() = to_string(p - m);
            }else{
                st.push_back(s.substr(i, 1));
            }
            prenum = false;
        }
    }
    //st.pop_back();//これいらないかも
    long long p = 0, m = 0;
    while(st.size() >= 1){
        if(st.size() >= 2 && st.rbegin()[1] == "+"){
            p += stoll(st.back());
            st.pop_back();st.pop_back();
        }else if(st.size() >= 2 && st.rbegin()[1] == "-"){
            m += stoll(st.back());
            st.pop_back();st.pop_back();
        }else{
            p += stoll(st.back());
            st.pop_back();
        }
    }
    return p - m;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    cin >> s;
    cout << eval(s) << '\n';
}
            
            
            
        