#include<bits/stdc++.h>
using namespace std;
int T,L,rl,num,now,Fnum,Enum,bjsd,yy=1,dd;
/*L表示程序长 ,num表示期望n的几次方,rl表示真实的几次方 ,now代表现在有几次方
Fnum表示已读的F的数量,Enum表示已读的E的数量 ,bjsd表示bj进入的F的数量,yy表示栈中的名字个数 ,dd表示当前循环为n的个数
*/
char c[105],sr,name,x[105],y[105],s[10005];
/*
s表示变量名栈
*/
bool err,no,yes,pd1,pd2,pd3,bj,sf[10005];/*
err表示程序错误,No表示期望错误,yes表示答案正确,pd1表示期望为常数
bj表示有此标记的循环不算数 ,sf表示第几个是否 为n的循环
*/
inline int read(){
int k=0,f=1;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-1;
for(;isdigit(c);c=getchar())
k=k*10+c-'0';
return k*f;
}
int main(){
// freopen("k.out","w",stdout);
T=read();
while(T--){
//记得归零
int ql=1;
rl=0,num=0,Fnum=0,Enum=0,bjsd=0,yy=1,dd=0,err=false,no=false,yes=false,pd1=false,pd2=false,pd3=false,bj=false;
while(s[ql]) s[ql]=0,ql++;
ql=1;
while(ql<10005) sf[ql]=false,ql++;
L=read();
if(L%2==1) err=true;
cin>>c;
if(c[2]=='1') pd1=true;
else{
num=num*10+c[4]-'0';
if(c[5]!=')') num=num*10+c[5]-'0';
}
for(int l=1;l<=L;l++){
cin>>sr;
// cout<<sr<<endl;
if(sr=='F'&&!bj){
dd++;
Fnum++;
cin>>name;
cin>>x>>y;
for(int i=1;i<=yy;i++){
// cout<<name<<" "<<s[i]<<endl;
if(s[i]==name)
err=true;
}
s[yy]=name;
yy++;
if(x[0]!='n'&&y[0]=='n') now++,sf[dd]=true;
else{
if(x[0]>y[0]) bj=true,bjsd=1;
else if(x[1]>y[1]&&x[0]==y[0]) bj=true,bjsd=1;
else if(x[0]=='n'&&y[0]!='n') bj=true,bjsd=1;
}
}
else if(sr=='F'&&bj){
cin>>name>>x>>y;
Fnum++;
}
else if(sr=='E'&&bj){
if(bj) bjsd--;
if(bjsd==0) bj=false;
Enum++;
}
else if(sr=='E'&&!bj){
Enum++;
rl=max(now,rl);
if(sf[dd]) now--,sf[dd]=false,dd--;
yy--;
s[yy]=0;
}
if(Enum>Fnum) err=true;
}
// cout<<rl<<" "<<now<<" "<<num<<endl;
// cout<<s[1]<<" "<<s[2]<<endl;
if(err){
cout<<"ERR"<<endl;
continue;
}
if((pd1&&rl)||(!pd1&&num!=rl)){
cout<<"No"<<endl;
continue;
}
else{
cout<<"Yes"<<endl;
continue;
}
}
/*
对于这类模拟题,我们为了写代码的条理性,往往可以采取如下的几个战略:
①:
在对变量命名时,在旁边用注释注好每个变量名的意思
②:
在写题之前,认真读题三遍,将思路大致写好,然后根据这些思路,写出一些注意事项
③:
在调试的时候加一些输出检验,这样可以检验几乎大部分错误
*/
}
模拟
最新推荐文章于 2025-06-23 14:03:35 发布