社区讨论
50pts玄关求助
P1310[NOIP 2011 普及组] 表达式的值参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mdye9j10
- 此快照首次捕获于
- 2025/08/05 18:26 7 个月前
- 此快照最后确认于
- 2025/11/04 03:09 4 个月前
CPP
#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;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...