(题目描述略)
注意以下情况:
- FE 不匹配导致 ERR,包括 F 多于 E 导致代码结束后循环未全部跳出,和 F 少于 E 导致代码执行过程中跳出代码块(该情况下可能局部 F 少于 E,但全局 F 等于 E)两种情况;
- 循环中可能包含多个同级循环,故需栈保存当前循环变量名和当前循环复杂度,F 进栈,E 出栈;
- 循环变量名生存期为相应循环 F 到 E,出栈后即刻销毁,不参与之后变量名同名查询;
- 循环范围 x 到 y 有以下三种情况:(字母 n 的 ASCII 码大于 100,可简化代码)
第一种情况:x 为常数,y 为 n,当前循环复杂度为前层循环复杂度加一;
第二种情况:x 为常数,y 为常数且 x ≤ y,或 x 和 y 都为 n,当前循环复杂度等于前层循环复杂度;
第三种情况:x 为常数,y 为常数且 x > y,或 x 为 n,y 为常数,当前循环及其子循环复杂度都等于前层循环复杂度,即该循环恒不被执行。
代码如下:
#include<stdio.h>
char o[10];
int stki[30],stkin[30],stkw[30];
int main()
{
freopen("complexity.in","r",stdin);
freopen("complexity.out","w",stdout);
bool err;
char fe,i;
int l,t,wm,wn,x,y;
scanf("%d",&t);
stki[0]=stkw[0]=0;
for(int j=0;j<26;j++)
stkin[j]=0;
while(t--)
{
scanf("%d %s",&l,o);
if(o[2]=='n')
if(o[6])
wn=(o[4]-'0')*10+(o[5]-'0');
else
wn=o[4]-'0';
else
wn=0;
err=false,wm=0;
while(l--)
{
scanf(" %c",&fe);
if(fe=='F')
{
scanf(" %c",&i);
if(scanf("%d",&x)==0)
scanf(" %c",&x);
if(scanf("%d",&y)==0)
scanf(" %c",&y);
if(stkin[i-'a']>0)
err=true;
stkin[stki[++stki[0]]=i-'a']++;
if(x!='n'&&y=='n')
stkw[stki[0]]=stkw[stki[0]-1]+1;
else if(x<=y)
stkw[stki[0]]=stkw[stki[0]-1];
else
stkw[stki[0]]=-100;
if(wm<stkw[stki[0]])
wm=stkw[stki[0]];
}
else
if(stki[0]>0)
stkin[stki[stki[0]--]]--;
else
err=true;
}
if(stki[0]>0)
for(err=true;stki[0]>0;stkin[stki[stki[0]--]]--);
puts(!err?wm==wn?"Yes":"No":"ERR");
}
return 0;
}