误点一:输入是使用的是字符串形式,误当做整数来运算,例如'10',直接和'1'比较大小,复杂度同样,输入的时候也是字符串形式,需要转换成数字形式
误点二:可能有F i n n 的情况,这时n位于b的位置,不属于循环终止的情况
误点三:1.只判断了可能E在F之前,例如F E E F,F可能在最后,导致循环不终止。2.E和F次数不匹配,可能E比F多,例如F F E E E,这种情况也属于ERR
误点四:要考虑循环逐层退出的情况,退出每一层都要逐层记录,同时记录a位置的小写字母的使用情况
思路就是直接模拟,判断特殊情况,记录循环层数和字母使用情况
#include<bits/stdc++.h>
using namespace std;
char e[110];
int main()
{
int t;
cin >> t;
while(t -- )
{
int l;
string s;
cin >> l >> s;
map<char , int > d;
int res = 0, y = 0, o = 0, m = 0, ans = 0, O = 0,mal = 0, r = 0, v = 0;
for(int i = 1; i <= l; i ++ )
{
char x;
cin >> x;
if(x == 'F')
{
r++;//记录F出现次数
res ++;//记录F的循环层数
char a;
string b, c;
cin >> a >> b >> c;
if(d[a] == 1)//判断a是否再次出现导致ERR
{
y = 1;
}
if(d[a] == 0) d[a] = 1,e[mal++] = a;//记录字母出现,同时存入出现的字母
if(b[0] == 'n' && m == 0 && c[0] != 'n') {m ++;}//记录无法进入循环的F
if(b[0] != 'n' && c[0] != 'n')//两个数字比较大小
{
int p1 = b.size();
int p2 = c.size();
int p3,p4;
if(p1 == 1) p3 = (b[0] - '0');
else if(p1 == 2) p3 = (b[0] - '0')*10 + (b[1] - '0');
//字符串转换为数字
if(p2 == 1) p4 = (c[0] - '0');
else if(p2 == 2) p4 = (c[0] - '0')*10 + (c[1] - '0');
//字符串转换为数字
if(p4 < p3) {m ++;}//无法进入循环
}
if(c[0] == 'n' && m == 0 && b[0] != 'n'){
o ++;
}
}
if(x == 'E')
{
mal--;
d[e[mal]] = 0;//清空字母出现次数
e[mal] = 0;//清除当前字母
if(res > 0) {res --;}
O = max(O, o);//最大时间复杂度
if(o > 0 && m == 0) {o -- ;}
if(m > 0) {m --;}
v++;//记录E出现次数
}
}
if(res > 0 || r != v)
{
cout << "ERR" << endl;
continue;
}//E和F不匹配
if(y == 1)
{
cout << "ERR" << endl;
continue;
}//新建的变量与已经存在但未被销毁的变量重复
if(O == 0)
{
if(s[2] != '1') cout << "No" << endl;
else cout << "Yes" << endl;
}
else
{
if(s[2] == 'n' && s[3] == '^')
{
int p5 = s.size()-5;
int p6;
if(p5 == 1) p6 = (s[4] - '0');
else if(p5 == 2) p6 = (s[4] - '0')*10 + (s[5] - '0');
//时间复杂度转换成数字
if(p6 == O) cout << "Yes" << endl;
else cout << "No" << endl;
}
else cout << "No" << endl;
}
}
return 0;
}