如题,其余9个测试点均已经AC,但是在#1出现了Too short on line 1.的问题,代码如下:
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
inline int rd() {
int ret = 0, flag = 1;
char c = getchar();
for (; c > '9' || c < '0'; c = getchar()) {
if (c == 'n')
return 0;
}
for (; c >= '0' && c <= '9'; c = getchar())
ret = ret * 10 + (c - '0');
return ret * flag;
}
struct statement {
vector<int> coefficients;
int lazy_mul_num = 1;
void lazy() {
for (vector<int>::iterator it = coefficients.begin(); it != coefficients.end(); ++it) {
*(it.base()) *= lazy_mul_num;
}
lazy_mul_num = 1;
}
void mul(int n) { lazy_mul_num *= n; }
void muln() {
this->lazy();
coefficients.insert(coefficients.begin(), 0);
}
void add(int n) {
this->lazy();
if (coefficients.size() == 0) {
coefficients.push_back(n);
} else {
coefficients[0] += n;
}
}
void add(statement st) {
this->lazy();
int size = min(coefficients.size(), st.coefficients.size());
for (int i = 0; i < size; ++i) {
coefficients[i] += st.coefficients[i];
}
if (coefficients.size() < st.coefficients.size()) {
int sz = st.coefficients.size();
for (int i = size; i < sz; ++i) {
coefficients.push_back(st.coefficients[i]);
}
}
}
void addn() {
this->lazy();
if (coefficients.size() == 0) {
coefficients.push_back(0);
coefficients.push_back(1);
} else if (coefficients.size() == 1) {
coefficients.push_back(1);
} else {
coefficients[1]++;
}
}
void print() {
this->lazy();
int size = coefficients.size();
bool flag = false, pr = false;
for (int i = size - 1; i >= 0; --i) {
if (coefficients[i] == 0) {
continue;
}
if (flag) {
printf("+");
}
if (coefficients[i] != 1) {
printf("%d", coefficients[i]);
}
if (i == 0) {
goto ac;
}
printf("n");
if (i != 1) {
printf("^%d", i);
}
ac:
pr = true;
if (!flag) {
flag = true;
continue;
}
}
if (!pr) {
printf("0");
}
printf("\n");
}
};
statement block(int n, bool inLoop = true) {
statement ret;
bool brk = false;
while (true) {
string cmd;
cin >> cmd;
if (cmd == "begin") {
continue;
}
if (cmd == "end") {
break;
} else if (cmd == "loop") {
int arg = rd();
statement tmp = block(arg);
if (!brk) {
ret.add(tmp);
}
} else if (cmd == "op" && !brk) {
int arg = rd();
if (arg) {
ret.add(arg);
} else {
ret.addn();
}
} else if (cmd == "break" && inLoop && !brk) {
n = 1;
brk = true;
} else if (cmd == "continue" && inLoop && !brk) {
brk = true;
}
}
if (n) {
ret.mul(n);
} else {
ret.muln();
}
ret.lazy();
return ret;
}
int main() {
block(1, false).print();
return 0;
}