首先我们来看下各种输出对应的情况:
ERR:
目前循环内用了重复字母
E多了
E少了

Yes:
期望和实际复杂度吻合
No:
期望和实际复杂度不吻合

然后我们来看下不同的正常循环的处理方式
F i a<b
b为n,a为常数,复杂度指数+1
b为常数 ,复杂度指数不变

F i a>b
内嵌循环失效(不执行)

for (程序数){
    各大数据初始化
    读入行数和期望复杂度
    for (输入行数){
***********以下关键*************
        层数+1
        读入操作符
        if (操作符是‘F’){
            读入变量
            if (变量使用过){
                err=1;
            }else {
                记录该字母使用过
                记录该循环层字母loopt[层数]=变量
            }

            (字符)读入a,b
            if (b是‘n’ && a不是‘n’ && 外层循环未失效){
                复杂度指数+1
                记录下该层循环的复杂度指数为1
            }else if (a>b){
                记录内嵌循环失效
                记录下开始失效的循环层数
            }//else 复杂度不变
        }else 操作符是‘E’跳出了一层循环{
            更新最大复杂度
            if (当前层循环的复杂度指数为1){
                复杂度--
                当前层循环复杂度初始化回1
            }
            当前层循环字母改为未使用 alpha[loopt[cnt]-'a']=0
            if (当前层已经是开始失效层的外层) 修改失效标记为不失效
            层数--
            if (层数<0){
                err=1
                防止出错cnt=0
            }
        }
    }
    if (err || (结束时)层数!=0) 输出ERR
    else if (期望一致) 输出Yes
    else 输出No
}
代码
#include <bits/stdc++.h>

using namespace std;
//dsahlfkjdalkfhlkasdhklfhasldkhfklahslk
string a,b;
int test,taro,o,alph[30],alpht[105],loopt[105],cnt,no,m,flag,l,err;

int main(int argc, char** argv) {
	cin>>test;
	while(test--){
		taro=o=no=m=flag=l=err=0;
		cnt=0;
		memset(alph,0,sizeof alph);
		memset(alpht,0,sizeof alpht);
		memset(loopt,0,sizeof loopt);
		
		cin>>l>>a;
		for(int i=4;i<a.size()-1;i++) taro=taro*10+a[i]-'0';
		for(int j=0;j<l;j++){
			cin>>a;
			if(a[0]=='F'){
				cnt++;
				cin>>b;
				if(alph[b[0]-'a']) err=1;
				else {
					alph[b[0]-'a']=1; 
					alpht[cnt]=b[0]-'a';
				}
				cin>>a>>b;
				
				if(b[0]=='n'&&a[0]!='n'&&!flag){
					o++;
					loopt[cnt]=1;
				}else if((a[0]=='n'&&b[0]!='n')||(a.size()>b.size())||(a.size()==b.size()&&a>b)){
					flag=1;no=cnt;
				}
				
			}else{
				m=max(m,o);
				if(loopt[cnt]) o--,loopt[cnt]=0;
				alph[alpht[cnt]]=0;
				if(cnt<no) flag=0;
				cnt--;
				if(cnt<0) err=1,cnt=0;
			}
		}
		
		if(err==1||cnt!=0) puts("ERR");
		else if(taro==m) puts("Yes");
		else puts("No");
	}
	return 0;
}