[Luogu3952] [NOIP2017] 时间复杂度 Complexity [模拟][栈]

[ L i n k \frak{Link} Link]


智商归零的我只好写写小模拟了
第一次交交了个64(没有考虑到循环并联
然后对着数据测
第二次交82(初始化不全)
第三次才A。。
把代码移植的时候还是要注意好,情况也要考虑周全,最好自己多出几组长数据?
题面要读清楚,不要被误导了。
能卡的地方就卡一下说不定就能够找出错误了。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cctype>
#include<cstring>
#include<stack>
using namespace std;
stack<pair<char, bool> >stk;
int L, pos;
bool complexityType;
bool vis[30];
int complexityNum;
int realComplexity;
int mxRealComplexity;
bool aisalpha,bisalpha;
int num[5];
int aNum,bNum;
bool ERR;
bool SUC;
char ch;
int nCancel = 0;
string str;
int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T; cin>>T;
	while (T--) {
		memset(vis, 0, sizeof(vis));
		cin >> L >> str;
		pos = 0;
		while (str[pos] != '(') ++pos;
		++pos;
		if (str[pos] == '1') {
			complexityType = 0;
			complexityNum = 0;
		}
		else {
			complexityType = 1;
			pos += 2;
			num[0] = 0;
			while (isdigit(str[pos])) {
				num[++num[0]] = str[pos] - '0';
				++pos;
			}
			complexityNum = 0;
			for (int i = 1; i <= num[0]; ++i) {
				complexityNum *= 10;
				complexityNum += num[i];
			}
		}
		while (!stk.empty()) stk.pop();
		SUC = ERR = 0;
		realComplexity = nCancel = 0;
		mxRealComplexity = 0;
		for (int i = 1; i <= L; ++i) {
			cin >> ch;
			if (ch == 'F') {
				
				
				
				cin >> ch; //i
				
				if (!ERR) {
				
					if (vis[ch-'a']) {
						ERR=1;
					}
					vis[ch-'a'] = 1;
				
				}
				
				
				
				cin >> str; //x
				
				if (!ERR) {
					
					if (str[0]=='n') {
						aisalpha = 1;
					} else {
						aisalpha = 0;
						num[0] = 0; 
						pos = 0; //**
						while (isdigit(str[pos])) {
							num[++num[0]] = str[pos] - '0';
							++pos;
						}
						aNum = 0;
						for (int j = 1; j <= num[0]; ++j) {
							aNum *= 10;
							aNum += num[j];
						}
					}
				}
				
				
				
				
				cin >> str; //y
				
				if (!ERR) {
				
					if (str[0]=='n') {
						bisalpha = 1;
					} else {
						bisalpha = 0;
						num[0] = 0; 
						pos = 0; //**
						while (isdigit(str[pos])) {
							num[++num[0]] = str[pos] - '0';
							++pos;
						}
						bNum = 0;
						for (int i = 1; i <= num[0]; ++i) {
							bNum *= 10;
							bNum += num[i];
						}
					}
				}
				
				
				stk.push(make_pair(ch,(!nCancel && !aisalpha && bisalpha)));
				if (!nCancel) {
					if (!aisalpha && bisalpha) ++realComplexity;
					if (aisalpha && !bisalpha) ++nCancel;
					if (!aisalpha && !bisalpha) {
						if (aNum > bNum) ++nCancel;
					}
				} else {
					++nCancel;
				}
				
				
				
				mxRealComplexity = max(mxRealComplexity, realComplexity);
			} else if (ch == 'E') {
				if (nCancel) --nCancel;
				if (stk.empty()) {
					ERR = 1;
				} else {
					realComplexity -= stk.top().second;
					vis[stk.top().first-'a'] = 0;
					stk.pop();
				}
			}
		}
		if (!stk.empty()) ERR = 1;
		if (complexityNum == mxRealComplexity) SUC=1;
		if (ERR) printf("ERR\n");
		else {
			if (SUC) printf("Yes\n");
			else printf("No\n");
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值