数据:
4
4 O(n^2)
F a 32 n
F b 69 n
E
E
2 O(n^2)
F a 60 n
E
4 O(n^4)
F a 67 n
F b 36 n
E
E
10 O(n^4)
F a 78 81
F b 73 98
F c 7 n
F d 46 n
F e 35 n
E
E
E
E
E
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<stack>
using namespace std;
int t,n,cnt,k,flag;
char op,ch;
bool vis[26],as;
string s,a;
stack<char> c;
stack<bool> crd;
inline void init()
{
as=0;
k=0;cnt=0;
for(int i=0;i<26;i+=1)
vis[i]=false;
while(!c.empty())
c.pop();
while(!crd.empty())
crd.pop();
}
inline bool optf()
{
string x[5];
int rnk=1;
ch=a[2];
for(int i=4;i<a.size();i+=1)
{
if(a[i]==' ') rnk+=1;
else if(a[i]<='9'&&a[i]>='0') x[rnk]+=a[i];
else if(a[i]=='n') x[rnk]="n";
}
if(vis[ch-'a']) return false;
vis[ch-'a']=1;
c.push(ch);
if(as)
{
crd.push(false);
return true;
}
if(x[1]=="n"&&x[2]=="n")
{
crd.push(false);
return true;
}
else if(x[1]=="n")
{
int num=0;
for(int i=0;i<x[2].size();i+=1)
num=num*10+(x[2][i]-'0');
if(num<=100)
{
as=1;
flag=cnt;
crd.push(false);
return true;
}
else
{
cnt+=1;
k=max(cnt,k);
crd.push(true);
return true;
}
}
else if(x[2]=="n")
{
cnt+=1;
k=max(cnt,k);
crd.push(true);
return true;
}
else
{
crd.push(false);
return true;
}
}
inline bool opte()
{
if(crd.empty()) return false;
if(crd.top()) cnt-=1;
crd.pop();
if(cnt<0) return false;
if(c.empty()) return false;
vis[c.top()]=false;
c.pop();
if(as&&cnt<false) as=false;
return true;
}
inline void work()
{
init();
cin>>n>>s;
getchar();
for(int i=1;i<=n;i+=1)
{
getline(cin,a);
if(a[0]=='F')
{
if(!optf())
{
printf("ERR\n");
return ;
}
}
else if(a[0]=='E')
{
if(!opte())
{
printf("ERR\n");
return ;
}
}
}
if(cnt)
{
printf("ERR\n");
return ;
}
int l=s.size();
if(s[2]=='1')
{
if(k==0)
{
printf("Yes\n");
return ;
}
else
{
printf("No\n");
return ;
}
}
else
{
int num=0;
for(int i=4;i<l-1;i+=1)
num=num*10+(s[i]-'0');
if(num==k)
{
printf("Yes\n");
return ;
}
else
{
printf("No\n");
return ;
}
}
return ;
}
int main()
{
scanf("%d",&t);
while ((t--))
work();
return 0;
}