1 条题解
-
0
思路与算法
循环栈维护变量生存期、空循环层数和有效n因子层数;扫描中始终检查语法,即使空循环体也不得重复变量或括号失配。
正确性说明
常数到n的非空循环提供一个n因子,n到n或常数区间提供常数因子,n到常数或反向常数区间不执行。只在全部外层有效时累积n因子,顺序程序复杂度由最大有效嵌套因子数决定。栈的压入弹出同时精确跟踪变量存活,故两类语法错误均被识别。
复杂度
每程序O(L)时间、O(L+26)空间,含变量表初始化及声明复杂度解析。
易错点
不可把不执行的循环体语法错误忽略;E过多或F未关闭均ERR,退出作用域后同名变量可以重新使用。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; struct F { char v; bool dead, add; }; int main() { int T; cin >> T; while (T--) { int L; string claimed; cin >> L >> claimed; int want = claimed == "O(1)" ? 0 : stoi(claimed.substr(4, claimed.size() - 5)); vector<F> st; int used[26] = {}, dead = 0, power = 0, best = 0; bool err = false; for (int i = 0; i < L; i++) { char c; cin >> c; if (c == 'F') { char v; string a, b; cin >> v >> a >> b; err |= used[v - 'a'] > 0; used[v - 'a']++; bool empty = (a == "n" && b != "n") || (a != "n" && b != "n" && stoi(a) > stoi(b)); bool add = !dead && !empty && a != "n" && b == "n"; st.push_back({v, empty, add}); dead += empty; power += add; best = max(best, power); } else if (st.empty()) err = true; else { auto f = st.back(); st.pop_back(); used[f.v - 'a']--; dead -= f.dead; power -= f.add; } } err |= !st.empty(); cout << (err ? "ERR" : best == want ? "Yes" : "No") << "\n"; } }
- 1