小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。
A++的循环结构如下:
F i x y
循环体
E
F i x y表示新建变量i(变量i不可与未被销毁的变量重名)并初始化为x,然后判断i和y的大小关系,若i <= y则进入循环,否则不进入。每次循环结束后i自增1,直到i > y终止循环。x和y可以是正整数(大小关系不定)或变量n。n是表示数据规模的变量,计算时间复杂度时需保留,不能视为常数,且n远大于100。E表示循环体结束,循环结束时该循环内新建的变量会被销毁。O表示通常意义下的Θ复杂度概念。t(t ≤ 10),表示需要处理的程序数量。L和字符串复杂度:L表示程序的行数。O(1)表示常数复杂度,O(n^w)表示复杂度为n^w(w为小于100的正整数)。L行,每行是F i x y或E:F开头的行:i是不为n的小写字母(变量名),x和y可以是正整数(小于100)或n。E开头的行:表示当前循环结束。每个程序对应一行输出:
ERR。语法错误仅包含两种:① F和E不匹配;② 新建变量与未销毁的活跃变量重名。即使错误出现在不会执行的代码中,也需要输出ERR。Yes,否则输出No。8
2 O(1)
F i 1 1
E
2 O(n^1)
F x 1 n
E
1 O(1)
F x 1 n
4 O(n^2)
F x 5 n
F y 10 n
E
E
4 O(n^2)
F x 9 n
E
F y 2 n
E
4 O(n^1)
F x 9 n
F y n 4
E
E
4 O(1)
F y n 4
F x 9 n
E
E
4 O(n^2)
F x 1 n
F x 1 10
E
E
Yes
Yes
ERR
Yes
No
Yes
Yes
ERR
i从1到1循环,常数复杂度,符合O(1),输出Yes。x从1到n循环,复杂度为O(n),符合输入的O(n^1),输出Yes。F无对应的E,语法错误,输出ERR。n循环,复杂度O(n^2),符合输入,输出Yes。n循环,复杂度仍为O(n),输入为O(n^2),不符合,输出No。y从n到4,n远大于4,循环不执行,总复杂度为O(n),符合输入的O(n^1),输出Yes。y从n到4,不执行,总复杂度为O(1),符合输入,输出Yes。x与外层重名,语法错误,输出ERR。L ≤ 10,x、y均为整数时x ≤ y,仅y可能为n。L ≤ 100,x、y均为整数时x ≤ y,仅y可能为n。L ≤ 100。L ≤ 100。