智商归零的我只好写写小模拟了
第一次交交了个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;
}