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; } -
1
#include <iostream> #include <stack> #include <string> using namespace std; const int MOD = 10007; struct Node { int dp0, dp1; Node(int a=0,int b=0):dp0(a),dp1(b){} }; int pri(char c){ if(c == '(') return 0; if(c == '+') return 1; if(c == '*') return 2; return -1; } Node calc(Node x, Node y, char op){ Node res; if(op == '*'){ res.dp0 = (1LL*x.dp0*(y.dp0+y.dp1)%MOD + 1LL*x.dp1*y.dp0%MOD )% MOD; res.dp1 = 1LL*x.dp1 * y.dp1 % MOD; }else{ // '+' res.dp0 = 1LL*x.dp0 * y.dp0 % MOD; res.dp1 = (1LL*x.dp0*y.dp1 + 1LL*x.dp1*y.dp0 + 1LL*x.dp1*y.dp1) % MOD; } return res; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int L; string s; cin >> L >> s; stack<Node> st; stack<char> op; st.emplace(1,1); //第一个变量 for(char ch : s){ if(ch == '('){ op.push(ch); st.emplace(1,1); }else if(ch == ')'){ while(op.top() != '('){ char o = op.top(); op.pop(); Node b = st.top(); st.pop(); Node a = st.top(); st.pop(); st.push(calc(a,b,o)); } op.pop(); // pop '(' }else{ // '+' or '*' while(!op.empty() && pri(op.top()) >= pri(ch)){ char o = op.top(); op.pop(); Node b = st.top(); st.pop(); Node a = st.top(); st.pop(); st.push(calc(a,b,o)); } op.push(ch); st.emplace(1,1); //新变量 } } while(!op.empty()){ char o = op.top(); op.pop(); Node b = st.top(); st.pop(); Node a = st.top(); st.pop(); st.push(calc(a,b,o)); } cout << st.top().dp0 << endl; return 0; } ``` ```
- 1
信息
- ID
- 717
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 10
- 已通过
- 3
- 上传者