73分求助(带注释)
查看原帖
73分求助(带注释)
953149
DoubleQLzn楼主2024/7/19 14:36

蒟蒻第一次完全自己做绿题,大模拟只拿了 7373 分.

#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;
}
2024/7/19 14:36
加载中...