题不难,思路就是复用了计算器的算法。自测各种数据都能得到正确解,但提交全都是WA,看错误信息感觉输出的都是“0”。是编译器的问题么?哪个大佬能帮忙看看?要跪了。 源代码如下:
#include <iostream>
#include <cstring>
using namespace std;
const int MOD = 10007, MAX = 100001;
int main()
{
int l, countOp, countNum, temp, num[MAX][2];
char op[MAX];
string exp;
cin >> l >> exp;
countOp = countNum = -1;
num[0][0] = num[0][1] = 1;
for (int i = 0; i < l; i++) {
if (exp[i] == '+') {
if (i == 0 || exp[i-1] != ')') num[++countNum][0] = num[countNum][1] = 1;
if (countOp >= 0) {
if (op[countOp] == '+') {
temp = (num[countNum-1][0] * num[countNum][0]) % MOD;
num[countNum-1][1] = (num[countNum-1][0] * num[countNum][1] + num[countNum-1][1] * num[countNum][0]
+ num[countNum-1][1] * num[countNum][1]) % MOD;
num[--countNum][0] = temp;
countOp--;
}
else if (op[countOp] == '*') {
temp = (num[countNum-1][1] * num[countNum][1]) % MOD;
num[countNum-1][0] = (num[countNum-1][0] * num[countNum][0] + num[countNum-1][0] * num[countNum][1]
+ num[countNum-1][1] * num[countNum][0]) % MOD;
num[--countNum][1] = temp;
countOp--;
}
}
op[++countOp] = exp[i];
}
else if (exp[i] == '*') {
if (i == 0 || exp[i-1] != ')') num[++countNum][0] = num[countNum][1] = 1;
if (countOp >= 0) {
if (op[countOp] == '*') {
temp = (num[countNum-1][1] * num[countNum][1]) % MOD;
num[countNum-1][0] = (num[countNum-1][0] * num[countNum][0] + num[countNum-1][0] * num[countNum][1]
+ num[countNum-1][1] * num[countNum][0]) % MOD;
num[--countNum][1] = temp;
countOp--;
}
}
op[++countOp] = exp[i];
}
else if (exp[i] == ')') {
if (exp[i-1] != ')') num[++countNum][0] = num[countNum][1] = 1;
while (op[countOp] != '(') {
if (op[countOp] == '+') {
temp = (num[countNum-1][0] * num[countNum][0]) % MOD;
num[countNum-1][1] = (num[countNum-1][0] * num[countNum][1] + num[countNum-1][1] * num[countNum][0]
+ num[countNum-1][1] * num[countNum][1]) % MOD;
num[--countNum][0] = temp;
countOp--;
}
else if (op[countOp] == '*') {
temp = (num[countNum-1][1] * num[countNum][1]) % MOD;
num[countNum-1][0] = (num[countNum-1][0] * num[countNum][0] + num[countNum-1][0] * num[countNum][1]
+ num[countNum-1][1] * num[countNum][0]) % MOD;
num[--countNum][1] = temp;
countOp--;
}
}
countOp--;
}
else if (exp[i] == '(') op[++countOp] = exp[i];
}
if (l && (exp[l-1] == '+' || exp[l-1] == '*')) num[++countNum][0] = num[countNum][1] = 1;
while (countOp >= 0) {
if (op[countOp] == '+') {
temp = (num[countNum-1][0] * num[countNum][0]) % MOD;
num[countNum-1][1] = (num[countNum-1][0] * num[countNum][1] + num[countNum-1][1] * num[countNum][0]
+ num[countNum-1][1] * num[countNum][1]) % MOD;
num[--countNum][0] = temp;
countOp--;
}
else if (op[countOp] == '*') {
temp = (num[countNum-1][1] * num[countNum][1]) % MOD;
num[countNum-1][0] = (num[countNum-1][0] * num[countNum][0] + num[countNum-1][0] * num[countNum][1]
+ num[countNum-1][1] * num[countNum][0]) % MOD;
num[--countNum][1] = temp;
countOp--;
}
}
cout << num[0][0];
return 0;
}