本题在洛谷上的链接:
堪称史上最恶心的模拟题!花了我几乎一天时间才调出来。。。
思路没啥好说的,开栈模拟即可,细节说一说。
1、每次处理一个新的程序时,将所有该初始化的都初始化,这点估计都能想到。
2、关于读入语句,可以一次读一行,也可以分开读,建议分成三个变量读,我用的一次读一行,坑死了!不过趁机学了一下c++关于读入行的知识,cin.getline(char*,int)用来操作字符数组,需要指定读入字符串大小,getline(istream,string)用来操作字符串,从指定流中读取一行。非常坑的一点,cin读字符串的时候,并不会读换行符,如果在此之后紧接着用getline读了一行,会什么也读不到,需要手动用getchar()把换行符杀掉。
3、如果遇到语法错误,别急着跳出,还要把剩下的读完。这个坑了我好久,最后把读入的全输出才发现。。。
剩下的自己看代码吧,估计也没耐心看,还是自己写慢慢调最靠谱。。。
1 #include2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 int vis[130];10 11 stack s, s2, s3;12 13 int main() {14 int t, l;15 string cpx, com;16 cin >> t;17 while (t--) {18 int flag = 1, now = 0, ans = 0;19 memset(vis, 0, sizeof(vis));20 while (!s.empty()) s.pop();21 while (!s2.empty()) s2.pop();22 while (!s3.empty()) s3.pop();23 cin >> l >> cpx;24 getchar();25 for (int i = 1; i <= l; ++i) {26 getline(cin, com);27 if (!flag) continue;28 if (com[0] == 'E') {29 if (s.empty()) {30 flag = 0;31 continue;32 }33 else {34 if (s3.empty()) {35 if (!s2.empty() && s.top() == s2.top()) s2.pop();36 else --now;37 } else if (s3.top() == s.top()) s3.pop();38 vis[(int)s.top()] = 0;39 s.pop();40 }41 } else {42 char x = com[2];43 if (vis[(int)x]) {44 flag = 0;45 continue;46 }47 else {48 vis[(int)x] = 1;49 s.push(x);50 }51 int a = 0, b = 0, p = 4;52 if (com[p] == 'n') a = 10005, ++p;53 else while (com[p] != ' ')54 a = a * 10 + com[p++] - '0';55 ++p;56 if (com[p] == 'n') b = 10005;57 else while (com[p])58 b = b * 10 + com[p++] - '0';59 if (a > b) s3.push(x);60 if (a < b && a < 10005 && b < 10005 && s3.empty())61 s2.push(x);62 if (a < b && b == 10005 && s3.empty()) ++now;63 ans = max(ans, now);64 }65 }66 if (!flag || !s.empty()) {67 printf("ERR\n");68 continue;69 }70 if (cpx[2] == '1' && cpx[3] == ')') {71 if (!ans) printf("Yes\n");72 else printf("No\n");73 } else {74 int aans = 0, p = 4;75 while (cpx[p] != ')')76 aans = aans * 10 + cpx[p++] - '0';77 if (aans == ans) printf("Yes\n");78 else printf("No\n");79 }80 }81 return 0;82 }