2 条题解
-
1
using namespace std; const int MOD = 10007; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int L; string s; cin >> L; getline(cin, s); // 吃掉换行 getline(cin, s); // L=0 时第二行为空串,必须用 getline vector<pair<int,int>> ops; // 操作数栈 (ways0, ways1) vector<char> stk; // 运算符栈(含 '(') auto apply = [&](char op) { auto b = ops.back(); ops.pop_back(); auto a = ops.back(); ops.pop_back(); int w0, w1; if (op == '*') { // ×:结果为 1 当且仅当两边都为 1 w0 = (a.first*b.first + a.first*b.second + a.second*b.first) % MOD; w1 = (a.second*b.second) % MOD; } else { // +:结果为 0 当且仅当两边都为 0 w0 = (a.first*b.first) % MOD; w1 = (a.first*b.second + a.second*b.first + a.second*b.second) % MOD; } ops.push_back({w0, w1}); }; bool expectOperand = true; for (char c : s) { if (c == '(') { stk.push_back(c); continue; } if (expectOperand) { ops.push_back({1,1}); expectOperand = false; } if (c == ')') { while (!stk.empty() && stk.back() != '(') { apply(stk.back()); stk.pop_back(); } if (!stk.empty()) stk.pop_back(); // 弹 '(' expectOperand = false; } else if (c == '*') { stk.push_back('*'); expectOperand = true; } else { // '+' while (!stk.empty() && stk.back() == '*') { apply(stk.back()); stk.pop_back(); } stk.push_back('+'); expectOperand = true; } } if (expectOperand) ops.push_back({1,1}); // 末尾变量 while (!stk.empty()) { apply(stk.back()); stk.pop_back(); } cout << ops.back().first % MOD << '\n'; return 0; }
信息
- ID
- 717
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 10
- 已通过
- 3
- 上传者