做题记录整理栈1 P3952 [NOIP2017 提高组] 时间复杂度(2022/9/15)
P3952 [NOIP2017 提高组] 时间复杂度
其实这题是个大模拟,但是由于运用到了栈的知识,就算是栈有关吧
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int inf = 2147483647;
char s[200],a[200],b[200];
char stack[200];
char F,id;
int top;
bool vis[200],ERR;
int cmp(char *a,char *b) {
	int an=0,bn=0;
	if(a[0]=='n') an=inf;
	else {
		for(int i=0; i<strlen(a); i++)
			an=an*10+a[i]-'0';
	}
	if(b[0]=='n') bn=inf;
	else {
		for(int i=0; i<strlen(b); i++)
			bn=bn*10+b[i]-'0';
	}
	if(an>bn) return -1;
	if(an<bn && bn==inf) return 1;
	if(an==bn) return 0;
}
int main() {
	int T;
	scanf("%d",&T);
	while(T--) {
		int n;
		memset(s,0,sizeof(s));
		memset(vis,0,sizeof(vis));
		memset(stack,0,sizeof(stack));
		top=0;
		scanf("%d",&n);
		cin >> s;
		int maxn=0,ans=0;
		int stop=0;
		ERR=false;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		if(s[2]=='1') {
			for(int i=1; i<=n; i++) {
				cin >> F;
				if(F=='E') {
					if(stop)stop--;
					vis[stack[top--]]=false;
					if(top==0) {
						ans=max(ans,maxn);
						maxn=0;
					}
					if(top<0)ERR=true;
				} else if(F=='F') {
					cin >> id;
					if(vis[id]) ERR=true;
					else vis[id]=1;
					stack[++top]=id;
					memset(a,0,sizeof(a));
					memset(b,0,sizeof(b));
					cin >> a >> b;
					if(stop) {
						stop++;
						continue;
					}
					int flag=cmp(a,b);
					if(flag==1) if(top>maxn)maxn++;
					if(flag==-1) stop++;
				}
			}
			if(top || ERR) {
				printf("ERR\n");
				continue;
			}
			if(ans!=0) {
				printf("No\n");
				continue;
			}
			printf("Yes\n");
		}
		if(s[2]=='n') {
			int num=0;
			for(int i=0; i<strlen(s); i++)
				if(s[i]>='0'&&s[i]<='9')num=num*10+s[i]-'0';
			for(int i=1; i<=n; i++) {
				cin >> F;
				if(F=='E') {
					if(stop)stop--;
					vis[stack[top--]]=false;
					if(top==0) {
						ans=max(ans,maxn);
						maxn=0;
					}
					if(top<0)ERR=true;
				} else if(F=='F') {
					cin >> id;
					if(vis[id]) ERR=true;
					else vis[id]=1;
					stack[++top]=id;
					memset(a,0,sizeof(a));
					memset(b,0,sizeof(b));
					cin >> a >> b;
					if(stop) {
						stop++;
						continue;
					}
					int flag=cmp(a,b);
					if(flag==1) if(top>=maxn+1)maxn++;
					if(flag==-1) stop++;
				}
			}
			if(top || ERR) {
				printf("ERR\n");
				continue;
			}
			if(ans!=num) {
				printf("No\n");
				continue;
			}
			printf("Yes\n");
		}
	}
	return 0;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号