2 条题解

  • 1
    @ 2026-9-5 12:01:14
    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
      @ 2026-9-5 10:30:42
      #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
      上传者