noip2017 D1T2 某zz选手考场上写了1.5h 考完之后发现自己写的是错的 但是结果A了???
题目大意:
一种新的编程语言 A++ 给出一个程序只有循环语句 并给出这个程序的时间复杂度
判断每个程序给出的时间复杂度是否正确。
A++语言的循环结构如下:
F i x y
循环体
E
其中F i x y
表示新建变量i(变量i不可与未被销毁的变量重名)并初始化为 x 然后判断 i 和 y 的大小关系,若 i 小于等于 y 则进入循环 否则不进入
每次循环结束后 i 都会被修改成 i +1,一旦 i 大于 y 终止循环
x 和 y 可以是正整数(x 和 y 的大小关系不定)或变量 n n 是一个表示数据规模的变量 在时间复杂度计算中需保留该变量而不能将其视为常数 该数远大于 100
“E”表示循环体结束 循环体结束时,这个循环体新建的变量也被销毁
输入格式:
T组数据
每个程序我们只需抽取其中 F i x y
和E
即可计算时间复杂度,注意:循环结构 允许嵌套。
接下来每个程序的第一行包含一个正整数 L 和一个字符串,L 代表程序行数,字符串表示这个程序的复杂度
O(1)
表示常数复杂度,O(n^w)
表示复杂度为n^w,其中w是一个小于100的正整数(输入中不包含引号),输入保证复杂度只有O(1)
和O(n^w)
两种类型
接下来 L 行代表程序中循环结构中的F i x y
或者 E
程序行若以F
开头,表示进入一个循环,之后有空格分离的三个字符(串)i x y
, 其中 i 是一个小写字母(保证不为n),表示新建的变量名
x 和 y 可能是正整数或 n ,已知若为正整数则一定小于 100
程序行若以E
开头,则表示循环体结束
输出格式:
输出文件共 t 行,对应输入的 t 个程序,每行输出Yes
或No
或者ERR
,若程序实际复杂度与输入给出的复杂度一致则输出Yes
,不一致则输出No
若程序有语法错误(其中语法错误只有: ① F 和 E 不匹配 ②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出ERR
注意:即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出 ERR
思路:
模拟
之前错的是因为没有考虑有两个进不去的循环嵌套(但还是A了
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cmath> 6 #include<cstring> 7 #include<vector> 8 #include<map> 9 #include<queue> 10 #define ll long long 11 #define inf 2147483611 12 #define MAXN 110 13 #define MOD 14 using namespace std; 15 inline int read() 16 { 17 int x=0,f=1;char ch=getchar(); 18 while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} 19 while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();} 20 return x*f; 21 } 22 int T,n,t3,t2,ans,tmp,tp,len,st[MAXN],s[MAXN]; 23 char o[30],ch[4][4]; 24 bool hsh[30],k[MAXN],j[MAXN]; 25 int main() 26 { 27 28 //freopen("complexity.in","r",stdin); 29 //freopen("complexity.out","w",stdout); 30 T=read(); 31 bool f;int sp; 32 while(T--) 33 { 34 n=read(),tmp=tp=ans=t3=t2=sp=0,f=1;scanf("%s",o); 35 memset(hsh,0,sizeof(hsh)); 36 memset(j,0,sizeof(j)); 37 for(int i=1;i<=n;i++) 38 { 39 scanf("%s",ch[0]); 40 if(ch[0][0]==‘E‘) 41 { 42 hsh[st[tp]]=0; 43 if(k[s[tp]]) tmp--; 44 if(j[s[tp]]) sp--; 45 tp--; 46 if(tp<0) f=0; 47 continue; 48 } 49 tp++; 50 s[tp]=i; 51 cin>>ch[1]>>ch[2]>>ch[3]; 52 len=strlen(ch[2]); 53 if(isdigit(ch[2][0])) t2=ch[2][0]-‘0‘; 54 else t2=inf; 55 if(len==2) t2=t2*10+ch[2][1]-‘0‘; 56 len=strlen(ch[3]); 57 if(isdigit(ch[3][0])) t3=ch[3][0]-‘0‘; 58 else t3=inf; 59 if(len==2) t3=t3*10+ch[3][1]-‘0‘; 60 if(hsh[ch[1][0]-‘a‘]) f=0; 61 hsh[ch[1][0]-‘a‘]=1;st[tp]=ch[1][0]-‘a‘; 62 if(t2>t3) {sp++;j[i]=1;} 63 if(t2<t3&&t3==inf) 64 { 65 tmp++; 66 k[i]=1; 67 if(sp) continue; 68 ans=max(ans,tmp); 69 } 70 else k[i]=0; 71 } 72 if(tp>0||!f) {puts("ERR");continue;} 73 len=strlen(o); 74 if(len==4&&ans==0) {puts("Yes");continue;} 75 int l=o[len-2]-‘0‘; 76 if(isdigit(o[len-3])) l+=10*(o[len-3]-‘0‘); 77 if(len>4&&l==ans) {puts("Yes");continue;} 78 puts("No"); 79 } 80 }