第32703题 程序题
【2017】判断A++程序的时间复杂度标注是否正确

题目背景

小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。

A++语言循环规则

A++的循环结构如下:

F i x y
    循环体
E
  1. F i x y表示新建变量i(变量i不可与未被销毁的变量重名)并初始化为x,然后判断iy的大小关系,若i <= y则进入循环,否则不进入。每次循环结束后i自增1,直到i > y终止循环。
  2. xy可以是正整数(大小关系不定)或变量nn是表示数据规模的变量,计算时间复杂度时需保留,不能视为常数,且n远大于100。
  3. E表示循环体结束,循环结束时该循环内新建的变量会被销毁。
  4. 注:本题中O表示通常意义下的Θ复杂度概念。

输入描述

  1. 第一行一个正整数tt ≤ 10),表示需要处理的程序数量。
  2. 每个程序的第一行包含正整数L和字符串复杂度:
    • L表示程序的行数。
    • 复杂度仅为两种:O(1)表示常数复杂度,O(n^w)表示复杂度为n^ww为小于100的正整数)。
  3. 接下来L行,每行是F i x yE
    • F开头的行:i是不为n的小写字母(变量名),xy可以是正整数(小于100)或n
    • E开头的行:表示当前循环结束。
  4. 循环允许嵌套。

输出描述

每个程序对应一行输出:

  • 若程序存在语法错误,输出ERR。语法错误仅包含两种:① FE不匹配;② 新建变量与未销毁的活跃变量重名。即使错误出现在不会执行的代码中,也需要输出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

样例说明

  1. 第一个程序:i从1到1循环,常数复杂度,符合O(1),输出Yes
  2. 第二个程序:x从1到n循环,复杂度为O(n),符合输入的O(n^1),输出Yes
  3. 第三个程序:有F无对应的E,语法错误,输出ERR
  4. 第四个程序:两层嵌套的n循环,复杂度O(n^2),符合输入,输出Yes
  5. 第五个程序:两个并列的n循环,复杂度仍为O(n),输入为O(n^2),不符合,输出No
  6. 第六个程序:内层循环yn到4,n远大于4,循环不执行,总复杂度为O(n),符合输入的O(n^1),输出Yes
  7. 第七个程序:外层循环yn到4,不执行,总复杂度为O(1),符合输入,输出Yes
  8. 第八个程序:内层循环变量x与外层重名,语法错误,输出ERR

数据规模与约定

  • 30%数据:无语法错误,L ≤ 10xy均为整数时x ≤ y,仅y可能为n
  • 50%数据:无语法错误,L ≤ 100xy均为整数时x ≤ y,仅y可能为n
  • 70%数据:无语法错误,L ≤ 100
  • 100%数据:L ≤ 100
编辑模式
程序运行统计
暂无判题统计