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