求助37pts(Y/N判成ERR)
查看原帖
求助37pts(Y/N判成ERR)
390770
S0CRiA楼主2021/10/4 16:41
//P3952
#include <bits/stdc++.h>
using namespace std;

const int inf = 0x3f3f3f3f;
struct Node{ char ch; int dep; };
int t, n, k, vis[200];
char s[110];

int read_O();
int getnum(char *num);
void read_for(char &op, char &ch, int &addO);

void solve(){
	memset(vis, 0, sizeof(vis));
	scanf("%d", &n); int k = read_O(), ans = 0, allO = 0;
	if(n == 1) ans = 1;
	stack<Node> st; while(!st.empty()) st.pop();
	for(int i = 1; i <= n; ++ i){
		char op, ch; int addO; read_for(op, ch, addO);
		if(ans) continue;
		if(op == 'F' && vis[ch]){ ans = 1; continue; } //变量名重复 
		vis[ch] = true;
		int nowO;
		if(op == 'F'){;
			if(st.empty()) nowO = addO;
			else if(st.top().dep == -1) nowO = -1;
			else if(addO == -1) nowO = -1;
			else nowO = st.top().dep + addO; 
			st.push((Node){ ch, nowO });
//			printf("k %d %d\n", addO, nowO);
		} else {
			if(st.empty()){ ans = 1; continue; } //E多 
			vis[st.top().ch] = false;
			st.pop();
		}
		allO = max(allO, nowO);
	}
	if(st.size()) ans = 1; //F多 
	if(!ans) ans = (allO == k ? 0 : 2);
//	printf("                   ");
	if(ans == 0) puts("Yes"); else if(ans == 1) puts("ERR"); else puts("No");
}

int main(){
	scanf("%d", &t);
	while(t--) solve();
	return 0;
}

int read_O(){
	scanf("%s", s);
	if(s[2] == 'n'){
		int p = 4, ans = 0;
		while(s[p] >= '0' && s[p] <= '9') ans = ans * 10 + s[p] - '0', ++ p;
		k = ans;
	} else k = 0;
//	printf("k %d\n", k);
	return k;
}
int getnum(char *num){
	if(num[0] == 'n') return inf;
	int p = 0, k = 0;
	while(num[p] >= '0' && num[p] <= '9') k = k * 10 + num[p] - '0', ++ p;
	return k;
}
void read_for(char &op, char &ch, int &addO){
	char op_[3], ch_[3], st_[10], ed_[10]; int st, ed;
	memset(st_, 0, sizeof(st_)), memset(ed_, 0, sizeof(ed_));
	scanf("%s", op_);
	if(op_[0] == 'F'){
		scanf("%s %s %s", ch_, st_, ed_);
		st = getnum(st_), ed = getnum(ed_);
//		printf("%d %d\n", st, ed);
	} else { op = 'E'; return; } 
	op = op_[0], ch = ch_[0];
	if(st > ed) addO = -1;
	else if(st == ed || (st < ed && ed != inf)) addO = 0;
	else addO = 1;
//	printf("O %d\n", addO);
}
2021/10/4 16:41
加载中...