【NOIP2017提高组Day 1】时间复杂度

Description

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

A++语言的循环结构如下:
在这里插入图片描述

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

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

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

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

Input

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

接下来每个程序的第一行包含一个正整数 L 和一个字符串,L 代表程序行数,字符串表示这个程序的复杂度,“O(1)”表示常数复杂度,“O(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”开头,则表示循环体结束。

Output

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

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

solution

这道题就是一道大模拟,主要就是细节实在是太多了,一不小心就进坑了,所以,打代码的你们可要小心点,一定要思考全面。这道题就是直接暴力,也没有什么好讲的了。

code

#include
#define gc getchar()
using namespace std;
int T,n,k,o,bz[6000],aa[6000],maxn,p,l,t[6000],tt,pp[6000],ttt,tttt;
//o表示层数,t表示是否进入此循环,p表示是n的几次方
char a;
int main()
{
     
	scanf("%d",&T);
	while(T--)
	{
     
		p=tt=ttt=tttt=l=k=o=maxn=a=0memset(bz,0,sizeof(bz)),memset(t,0,sizeof(t))memset(aa,0,sizeof(aa)),memset(pp,0,sizeof(pp));
		scanf("%d",&n);
		while(a!='(') a=gc;
		a=gc;
		if(a=='1') k=0;
		else
		{
     
			a=gc;
			scanf("%d",&k);
		}
		for(int i=1;i<=n;i++)
		{
     
			if(tt==0&&o<100) maxn=max(p,maxn);
			while(a!='F'&&a!='E') a=gc;
			if(a=='F')
			{
     
				o++;
				while(a>'z'||a<'a') a=gc;
				if(bz[a-'a']) o=999;
				if(o<100)
					bz[a-'a']=1,aa[o]=a;
				gc,a=gc;
				if(a=='n')
				{
     
					a=gc,a=gc;
					if(a!='n')
					{
     
						l=0;
						while(a<='9'&&a>='0') l=l*10+a-'0',a=gc;
						if(l<=100) maxn=max(p,maxn),tt++,t[o]=1;
					}
				}
				else
				{
     
					ttt=tttt=0;
					while(a!=' ') ttt=ttt*10+a-'0',a=gc;
					a=gc;
					if(a=='n')
					{
     
						p++,pp[o]=1;
						if(tt==0) maxn=max(p,maxn);
					}
					else
					{
     
						while(a<='9'&&a>='0') tttt=tttt*10+a-'0',a=gc;
						if(ttt>tttt) tt++,t[o]=1;
					}
				}
				a=gc;
			}
			else
			{
     
				if(o<=0)
				{
     
					o=999;
				}
				if(o<100)
				{
     
					bz[aa[o]-'a']=0,tt-=t[o],t[o]=0;
					p-=pp[o],pp[o]=0,o--;
				}
				a=gc;
			}
		}
		if(o==0)
		{
     
			if(maxn==k) printf("Yes\n");
			else printf("No\n");
		}
		else printf("ERR\n");
	}
	return 0;
}

你可能感兴趣的:(题解)