問題概要
太郎君の国では、足し算は$*$の記号で、また、掛け算は$+$の記号で表されます。 また、足し算と掛け算に優先度はなく、左から順番に計算します。 これを計算せよ。
$|S|\leqq10^2$
解法
構文解析をしっかり書く必要はなくて、状態遷移していけば良い。
計算量:$O(|S|)$
ソース
#include <bits/stdc++.h> using namespace std; using VS = vector<string>; using LL = long long; #define SZ(a) int((a).size()) #define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++) LL N; LL ans = 0LL; int main() { cin.tie(0); ios_base::sync_with_stdio(false); string s; cin >> s; LL ret = 0, sub = 0; int mode = 0; FOR(i, 0, SZ(s)) { if (isdigit(s[i])) { sub *= 10; sub += s[i] - '0'; } else { if (mode == 1) { // + ret += sub; } else if (mode == 2) { ret *= sub; } else { ret = sub; } sub = 0; if (s[i] == '+') { mode = 2; } else { mode = 1; } } } if (mode == 1) { // + ret += sub; } else if (mode == 2) { ret *= sub; } else { ret = sub; } ans = ret; cout << ans << "\n"; return 0; }