P3952 时间复杂度

题目描述

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

A++语言的循环结构如下:

F i x y
循环体
E

其中F i x y表示新建变量 ii(变量 ii 不可与未被销毁的变量重名)并初始化为 xx, 然后判断 ii和 yy 的大小关系,若 ii 小于等于 yy 则进入循环,否则不进入。每次循环结束后 ii 都会被修改成 i +1i+1,一旦 ii 大于 yy 终止循环。

xx 和 yy 可以是正整数(xx 和 yy 的大小关系不定)或变量 nn。nn 是一个表示数据规模的变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数远大于 100100。

“E”表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。

注:本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意义下“Θ”的概念。

输入输出格式

输入格式:

输入文件第一行一个正整数 t,表示有 t(t<=10)个程序需要计算时间复杂度。 每个程序我们只需抽取其中 F i x yE即可计算时间复杂度。注意:循环结构 允许嵌套。

接下来每个程序的第一行包含一个正整数 LL 和一个字符串,LL 代表程序行数,字符 串表示这个程序的复杂度,O(1)表示常数复杂度,O(n^w)表示复杂度为n^w,其 中w是一个小于100的正整数(输入中不包含引号),输入保证复杂度只有O(1)O(n^w) 两种类型。

接下来 L 行代表程序中循环结构中的F i x y或者 E。 程序行若以F开头,表示进入一个循环,之后有空格分离的三个字符(串)i x y, 其中 ii 是一个小写字母(保证不为n),表示新建的变量名,x 和 y 可能是正整数或 nn ,已知若为正整数则一定小于 100。

程序行若以E开头,则表示循环体结束。

输出格式:

输出文件共 t行,对应输入的 t 个程序,每行输出YesNo或者ERR(输出中不包含引号),若程序实际复杂度与输入给出的复杂度一致则输出Yes,不一致则输出No,若程序有语法错误(其中语法错误只有: ① F 和 E 不匹配 ②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出ERR 。

注意:即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出 ERR

输入输出样例

输入样例#1:

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
输出样例#1:

Yes
Yes
ERR
Yes
No
Yes
Yes
ERR

说明

【输入输出样例解释1】

第一个程序 i从 1 到 1 是常数复杂度。

第二个程序 x 从 1 到 n 是 n 的一次方的复杂度。

第三个程序有一个 F 开启循环却没有 E 结束,语法错误。

第四个程序二重循环,n 的平方的复杂度。

第五个程序两个一重循环,n 的一次方的复杂度。

第六个程序第一重循环正常,但第二重循环开始即终止(因为n远大于100,100大于4)。

第七个程序第一重循环无法进入,故为常数复杂度。

第八个程序第二重循环中的变量 x 与第一重循环中的变量重复,出现语法错误②,输出 ERR

【数据规模与约定】

对于 %30%的数据:不存在语法错误,数据保证小明给出的每个程序的前 L/2 行一定为以 F 开头的语句,第 L/2+1 行至第 L 行一定为以 E开头的语句,L≤10,若 x、y 均 为整数,x 一定小于 y,且只有 yy 有可能为 nn。

对于 50%的数据:不存在语法错误,L <=100,且若 x、y 均为整数,x 一定小于 y, 且只有 y有可能为 n。

对于 70%的数据:不存在语法错误,L≤100。

对于 100%的数据:L≤100。

  思路:

  直接用getline(cin,str)一行一行读,写一个get_num获取其中的数字,将'n'视为一个极大的数

  • 用一个栈模拟存变量,ins标记是否被定义过,用来判ERR,used表示该变量对复杂度是否有贡献,用flag来维护最早的不能进入循环的变量(如for int i=3 ; i<=1 ; i++),因为在它之后的根本不能运行,初始化为-1,出栈时判一下如果flag=k,则其后面的语句又可以正常运行了,令flag=-1.

代码

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cmath>
#include <stack>
using namespace std; #define res register int
int T,n;
stack <int> s;
bool ins[],used[];//是否在栈中,对时间复杂度是否有贡献
string o,code[]; template <typename T>
inline T my_max(T a,T b) {return a>b?a:b;}
template <typename T>
inline T my_min(T a,T b) {return a<b?a:b;} inline int get_num(int &x,string c)
{
int tmp(),len=c.size();
while(!isdigit(c[x]) && x<len)
{
if(c[x]=='n') {++x; return ;}
++x;
}
while(isdigit(c[x])) {
tmp=tmp*+c[x]-'';
x++;
}
return tmp;
} inline int get_o()
{
int tmp(),x=;
if(o[]=='n') tmp=get_num(x,o);
else tmp=;//O(1)对应0
return tmp;
} inline int check()
{
int now(),cp();//complexity
int a,b,x;
while(s.size()) s.pop();
memset(ins,,sizeof(ins));
memset(used,,sizeof(used));
int flag(-);
for(res i= ; i<=n ; i++)
{
if(code[i][]=='F')
{
int k=code[i][]-'a';
if(ins[k]) return -;
ins[k]=true; s.push(k);
x=;
a=get_num(x,code[i]);
b=get_num(x,code[i]);
//flag为最早的不能循环的对应的变量k,可以正常循环时为-1
if(b-a> && flag==-)
{
used[k]=true; now++;
cp=my_max(cp,now);
}
else if(a>b && flag==-)
flag=k;
}
else
if(code[i][]=='E')
{
if(s.empty()) return -;
int k=s.top();
s.pop(); ins[k]=false;
if(flag==k) flag=-;
if(used[k]) now--,used[k]=false;
}
}
if(s.size()) return -;
return cp;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d ",&n);
getline(cin,o);
int x0=get_o();
for(res i= ; i<=n ; i++)
getline(cin,code[i]);
int x1=check();
if(x1==-) puts("ERR");
else
{
if(x0==x1) puts("Yes");
else puts("No");
}
}
// system("pause");
return ;
}

P3952 时间复杂度的更多相关文章

  1. luogu P3952 时间复杂度 模拟

    题目链接 luogu P3952 时间复杂度 题解 直接模拟即可 注意不要直接return 我真是naive ...... 代码 #include<map> #include<sta ...

  2. 洛谷 P3952 时间复杂度 解题报告

    P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会 ...

  3. 洛谷P3952 时间复杂度【字符串】【模拟】

    题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...

  4. 【luogu P3952 时间复杂度】 题解

    对于2017 D1 T2 这道题 实实在在是个码力题,非常考验耐心. 其实大体的思路并不是非常难想出来,但是要注意的小细节比较多. 题目链接:https://www.luogu.org/problem ...

  5. 洛谷 - P3952 - 时间复杂度 - 模拟

    https://www.luogu.org/problemnew/show/P3952 这个模拟,注意每次进入循环的时候把新状态全部入栈,退出循环的时候就退栈. 第一次就错在发现ERR退出太及时,把剩 ...

  6. 洛谷P3952 时间复杂度

    大毒瘤...... 时隔快半年我终于花了两个小时堪堪A掉这一题...果然我还没有准备好. 想法:用DFS模拟递归. 时间复杂度的处理:每层循环取max,然后相加. 最大难点:各种繁杂而令人发指的特判. ...

  7. LOJ P3952 时间复杂度 noip 暴力 模拟

    https://www.luogu.org/problemnew/show/P3952 模拟,日常认识到自己zz. #include<iostream> #include<cstdi ...

  8. [LUOGU] P3952 时间复杂度

    其实,也没那么难写 这种模拟题,仔细分析一下输入格式,分析可能的情况,把思路写在纸上,逐步求精,注意代码实现 主要思路就是算一个时间复杂度,和给出的复杂度比较,这就先设计一个函数把给出的复杂度由字符串 ...

  9. 计蒜客 时间复杂度 (模拟) & 洛谷 P3952 时间复杂度

    链接 : Here! 思路 : 这是一道大模拟, 区分好情况就没问题了 循环构成部分 : $F , x , i , j$ 和 $E$ , 需要注意的是 $i , j$, - 分析 $i, j$ 的情况 ...

随机推荐

  1. Java-CSV文件读取

    import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import ja ...

  2. Python实现目录文件的全量和增量备份

    目标: 1.传入3个参数:源文件路径,目标文件路径,md5文件 2.每周一实现全量备份,其余时间增量备份 1.通过传入的路径,获取该路径下面的所有目录和文件(递归) 方法一:使用os.listdir ...

  3. KVM下raw和qcow2格式磁盘文件IO测试

    1. Host OS 环境 CPU: Intel Xeon E5620 2.40GHz MEM: 16GB DISK: 500GB SATA OS: CentOS5.7 64bit 2. Guest ...

  4. Java 依赖注入标准(JSR-330)简介

    作者:88250 ,Vanessa 时间:2009 年 11 月 19 日      Java 依赖注入标准(JSR-330,Dependency Injection for Java)1.0 规范已 ...

  5. 修改字符集AL32UTF8修改为ZHS16GBK详解

    登陆sqlplus,在命令行输入 sqlplus sys/sys as sysdba;//登陆sqlplus SQL>SHUTDOWN IMMEDIATE; SQL>STARTUP MOU ...

  6. csv乱码

    可能:iconv转码导致,本身已经是GBK,又进行了GBK转码

  7. efcore dbfirst 通过数据库表反向生成model

    创建class library并设置为启动项目 使用nuget控制台,设置当前项目为新建的class library Install-Package Microsoft.EntityFramework ...

  8. 没有Reduce的MapReduce(一)

    尝试了一个没有Reduce的MapReduce. [应用场景]: 从Hbase的A表中进行数据抽样,直接输出到B表中. 这种场景下,相当于只进行了一个数据检索,本来是用Hive就可以实现,但是考虑到业 ...

  9. Go 笔记和疑问?

    前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...

  10. R语言笔记完整版

    [R笔记]R语言函数总结   R语言与数据挖掘:公式:数据:方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头, ...