蒟蒻第一次完全自己做绿题,大模拟只拿了 73 分.
#include <bits/stdc++.h>
using namespace std;
char a[105],b[105];//对应:a[i]:F/E b[i]变量名 c[i] i,d[i] j
string c[105],d[105];
int f[200];
int numcmp(string a,string b) //比较两个数的大小(字典序中13.11>13.8懂的都懂)
{
if (a.size() > b.size() || (a.size() == b.size() && a > b)) return 1;
return 2;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0); //cin/cout版素质三连
int t,n;
cin >> t;
while (t--)
{
memset(f,0,sizeof f); //初始化标记数组
int f2 = 1,f3 = 1,sa = 0,sb = 0,o = 0,x = 0,f4 = 1,ma = 0;
//f2:错误情况1 f3:错误情况2 sa:出现的F数量 sb:出现的E数量 o:每次循环执行完后实时更新的时间复杂度
//x:程序输入的执行次数(O(1)为0,O(n^2)为2,f4:是否应该退出循环 ma:o的最大值
stack<char> s1,s2; //s1是为了对应F与E,防止错误情况1,s2里面存变量,防止错误情况2
char e;//
string k;//输入的字符串
cin >> n >> k;
if (k[2] == '1') //O(1)时对应上面
{
x = 0;
}
else
{
x = 0;
for (int i = 4;i < k.size() - 1;i++)
{
x = x * 10 + (k[i] - '0');//算出O(n^x)中的x
}
}
for (int i = 1;i <= n;i++)
{
cin >> a[i];
if (a[i] == 'F')
{
sa++;
cin >> b[i] >> c[i] >> d[i];
s1.push('F');
if (f[b[i]] == 0)
{
s2.push(b[i]);
f[b[i]]++; //标记以下b[i]出现
if (c[i] != "n" && d[i] == "n" && f4) //只有c[i]!=n,d[i]=n,且还没退出循环时更新
{
o++;
ma = max(ma,o); //更新最大值
}
else if (c[i] == "n" && d[i] != "n") //退出循环,当出现c[i]=n,d[i]<100
{
f4 = 0;
}
else if (numcmp(c[i],d[i]) == 1) //退出循环
{
f4 = 0;
}
}
else
{
f2 = 0;
}
}
if (a[i] == 'E')
{
sb++;
if (!s1.empty())
{
o--; //退出循环
s1.pop(); //弹出语句
if (!s2.empty())
{
char t = s2.top();
f[t]--; //清空标记(好像DFS
s2.pop();
}
}
else
{
f3 = 0;
}
}
}
if (f2 == 0 || f3 == 0 || sa != sb) //F与E要匹配
{
cout << "ERR\n";
}
else if (ma == x)
{
cout << "Yes\n";
}
else
{
cout << "No\n";
}
}
return 0;
}