首先我们来看下各种输出对应的情况:
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; }