結果

問題 No.708 (+ー)の式
ユーザー t98slidert98slider
提出日時 2022-11-24 22:43:47
言語 C++14
(gcc 11.2.0 + boost 1.78.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 2,217 Byte
コンパイル時間 1,712 ms
使用メモリ 3,532 KB
最終ジャッジ日時 2022-11-24 22:43:53
合計ジャッジ時間 2,804 ms
ジャッジサーバーID
(参考情報)
judge12 / judge15
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
testcase_00 AC 1 ms
3,532 KB
testcase_01 AC 2 ms
3,464 KB
testcase_02 AC 1 ms
3,460 KB
testcase_03 AC 2 ms
3,492 KB
testcase_04 AC 2 ms
3,396 KB
testcase_05 AC 2 ms
3,532 KB
testcase_06 AC 2 ms
3,480 KB
testcase_07 AC 2 ms
3,516 KB
testcase_08 AC 2 ms
3,472 KB
testcase_09 AC 2 ms
3,460 KB
testcase_10 AC 1 ms
3,528 KB
testcase_11 AC 2 ms
3,500 KB
testcase_12 AC 1 ms
3,408 KB
testcase_13 AC 2 ms
3,512 KB
testcase_14 AC 2 ms
3,528 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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';
}
0