大模拟题,十分毒瘤。看了题解调了很久,具体还是去看看dolao的题解
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#define ll long long
#define rint register int
using namespace std;
stack<int> zhan;
int main()
{
int t;scanf("%d",&t);
while(t--)
{
int n;scanf("%d",&n);
int nowline=0,pos=0;
int Fcnt=0,Ecnt=0,cnt=0;
int hisans=0,myans=0;
int runflag=-1;
bool endflag=false;
string tmp;cin>>tmp;
string sublist="0";
for(rint i=0;i<tmp.length();++i)
if(tmp[i]>='0'&&tmp[i]<='9')
{
hisans+=tmp[i]-'0';
hisans*=10;
}
hisans/=10;
if(tmp[2]=='1') hisans=0;
for(rint i=1;i<=n;++i)
{
string sub,opt,tmpsta,tmpend;
int sta=0,end=0;
cin>>opt;
if(opt=="F")
{
++Fcnt;++pos;
zhan.push(pos);
cin>>sub>>tmpsta>>tmpend;
if(tmpend[0]=='n'&& (!(tmpsta[0]=='n'&&tmpend[0]=='n'))) ++cnt;
for(rint j=0;j<tmpsta.length();++j)
{
sta+=tmpsta[j]-'0';
sta*=10;
}
sta/=10;
if(tmpend[0]!='n')
{//如果end是数字
for(rint i=0;i<tmpend.length();++i)
{
end+=tmpend[i]-'0';
end*=10;
}
end/=10;
if(sta>end)//如果循环不能执行
runflag=pos;
}
if(runflag==-1||pos<runflag) myans=max(myans,cnt);
sublist+=sub;
if(sublist.find(sub)!=sublist.length()-1)
printf("ERR\n");cnt=0;nowline=i;endflag=true;break;
sta=0;end=0;
}
else if(opt=="E")
{
--cnt;++Ecnt;
if(zhan.empty()&&!endflag)
{
printf("ERR\n");cnt=0;nowline=i;endflag=true;break;
}
if(zhan.top()<=runflag)
{
pos=0;
runflag=-1;
}
if(!zhan.empty()) zhan.pop();
if(sublist.length()>0) sublist=sublist.substr(0,sublist.length()-1);
if(zhan.empty()) cnt=0;
}
}
if(endflag){
cnt=0;
while(!zhan.empty())
zhan.pop();
string cnm;
for(rint i=1;i<=n-nowline+1;++i) getline(cin,cnm);
continue;
}
if(Fcnt!=Ecnt)
{
if(!endflag) printf("ERR\n");
while(!zhan.empty()) zhan.pop();
cnt=0;
continue;
}
while(!zhan.empty()) zhan.pop();
if(!endflag){
if(myans==hisans) printf("Yes\n");
else printf("No\n");
}
myans=hisans=0;
}
return 0;
}