50pts玄关求助
查看原帖
50pts玄关求助
911026
jaspersgr114514楼主2025/8/5 18:24
#include <bits/stdc++.h>
using namespace std;
const int mod = 10007;
string s;
int xx[100005];
int ad[100005], mi[100005]; 
void prepp(int n) {
    int lstp = -1, lstm = -1;
    int x = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == '(') x++;
        else if (s[i] == ')') x--;
        
        ad[i] = (x == 0 && s[i] == '+') ? i : lstp;
        mi[i] = (x == 0 && s[i] == '*') ? i : lstm;
        if (x == 0) {
            if (s[i] == '+') lstp = i;
            else if (s[i] == '*') lstm = i;
        }
    }
}
int gtr(int ll, int rr, int exp) {
    int len = rr - ll + 1;
    if (len == 0) return 1;
    if (len == 1) {
        if (s[ll] == '+') return exp == 1 ? 3 : 1;
        else if (s[ll] == '*') return exp == 1 ? 1 : 3;
    }
    int lstad = -1, lstmi = -1;
    if (xx[rr] == xx[ll]) {
        lstad = ad[rr];
        lstmi = mi[rr];
        while (lstad >= ll && (s[lstad] != '+' || xx[lstad] != xx[ll])) lstad--;
        while (lstmi >= ll && (s[lstmi] != '*' || xx[lstmi] != xx[ll])) lstmi--;
    }
    if (lstad != -1 && lstad >= ll) {
        if (exp == 1) {
            return (gtr(ll, lstad - 1, 1) * gtr(lstad + 1, rr, 0) % mod + 
                    gtr(ll, lstad - 1, 1) * gtr(lstad + 1, rr, 1) % mod + 
                    gtr(ll, lstad - 1, 0) * gtr(lstad + 1, rr, 1) % mod) % mod;
        } else {
            return gtr(ll, lstad - 1, 0) * gtr(lstad + 1, rr, 0) % mod;
        }
    }
    else if (lstmi != -1 && lstmi >= ll) {
        if (exp == 1) {
            return gtr(ll, lstmi - 1, 1) * gtr(lstmi + 1, rr, 1) % mod;
        } else {
            return (gtr(ll, lstmi - 1, 1) * gtr(lstmi + 1, rr, 0) % mod + 
                    gtr(ll, lstmi - 1, 0) * gtr(lstmi + 1, rr, 0) % mod + 
                    gtr(ll, lstmi - 1, 0) * gtr(lstmi + 1, rr, 1) % mod) % mod;
        }
    }
    else {
        return gtr(ll + 1, rr - 1, exp);
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    int l;
    cin >> l >> s;
    int cnt = 0;
    for (int i = 0; i < l; i++) {
        if (s[i] == '(') cnt++;
        else if (s[i] == ')') cnt--;
        xx[i] = cnt;
    }
    prepp(l);
    cout << gtr(0, l - 1, 0);
    return 0;
}
2025/8/5 18:24
加载中...