魔鬼的大力模拟题。
千万要注意大小写。
注意数字、字符串转化。这个细节困扰了我很久。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Max(_A,_B) ((_A)>(_B)?(_A):(_B))
bool usd[30];
//lv==-1:这层循环根本不会被执行。
struct data{
int lv;
int x;
}st[105];
int tp=0,n,slv=0,nlv=0,ans=0;
char ch[105];
inline int cg(){
int _X=0,_BS=10,i=0;
while(ch[i]<'0'||ch[i]>'9'){
++i;
}
while(ch[i]>='0'&&ch[i]<='9'){
_X*=_BS;
_X+=((ch[i]-'0'));
++i;
}
return _X;
}
void init(){
scanf("%d",&n);
memset(usd,0,sizeof(usd));
tp=0,nlv=0;
int ss,tt;
cin>>ch;
if(ch[2]=='1'){
slv=0;
}else{
slv=cg();
}
st[0].lv=0;
st[0].x=-1;
bool bo=0;
for(int i=1;i<=n;++i){
cin>>ch;
if(ch[0]=='E'){
if(!tp){
bo=1;
}else{
nlv=Max(nlv,st[tp].lv);
usd[st[tp].x]=0;
--tp;
}
}else{
cin>>ch;
++tp;
if(usd[ch[0]-'a']){
bo=1;
}else{
usd[ch[0]-'a']=1;
st[tp].x=ch[0]-'a';
}
memset(ch,0,sizeof(ch));
cin>>ch;
if(ch[0]=='n'){
ss=100000;
}else{
ss=cg();
}
memset(ch,0,sizeof(ch));
cin>>ch;
if(ch[0]=='n'){
tt=100000;
}else{
tt=cg();
}
memset(ch,0,sizeof(ch));
if(st[tp-1].lv==-1){
st[tp].lv=-1;
continue;
}
if(ss>tt){
st[tp].lv=-1;
}else if(ss==tt||(tt!=100000)){
st[tp].lv=st[tp-1].lv;
}else if(tt==100000){
st[tp].lv=st[tp-1].lv+1;
}
}
}
if(tp||bo){
puts("ERR");
return;
}
if(nlv==slv){
puts("Yes");
}else{
puts("No");
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
init();
}
return 0;
}