首先我们来看下各种输出对应的情况:
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;
} 
京公网安备 11010502036488号