NOIP2017D1T2 时间复杂度

题面
大大大大模拟 比较毒瘤…
最最最重要的一点是 w h i l e ( n − − ) while(n--) while(n) n = − 1 n=-1 n=1时程序还会接着跑下去…因为这个卡了一个小时…
具体看代码吧,一步一步写就会成功
P S : PS: PS:变量过多所以我解释一下都是什么意思
t t t是数据组数, n n n是一个程序中句子的数量
a n s ans ans是程序的答案, s u m sum sum是小明的答案
e n t ent ent是这个循环能不能进去, n o w now now是这个嵌套层数位置的循环进不去 在这个循环里的程序都没有用
t i m tim tim是当前时间复杂度, r e p rep rep指的是 F F F E E E多几个
上代码 (自认为代码比较短

#include<bits/stdc++.h>
using namespace std;
string a,b;
int t,n,ans,sum,now,tim,rep,nam[30];
bool ent,vis[30],add[110];
int main(){
    
    
	scanf("%d",&t);
	while(t--){
    
    
		n=sum=ans=rep=tim=ent=now=0;
		memset(vis,0,sizeof(vis));
		memset(nam,0,sizeof(nam));
		memset(add,0,sizeof(add));
		while(b[0]!='O'){
    
    a=b;cin>>b;}
		int lena=a.length(),lenb=b.length();
		for(int i=0;i<lena;i++)n=(n<<3)+(n<<1)+(a[i]&15);
		for(int i=4;i<lenb-1;i++)sum=(sum<<3)+(sum<<1)+(b[i]&15);
		while(n>0){
    
    //不是n--!不然程序出不去!!
			n--;
			cin>>a;
			if(a[0]=='F'){
    
    
				rep++;cin>>a;
				if(vis[a[0]-'a'])rep=-1;
				else vis[a[0]-'a']=true,nam[rep]=a[0]-'a';
				cin>>a>>b;
				if(a[0]!='n'&&b[0]=='n'&&!ent)tim++,add[rep]=true;
				else if((a[0]=='n'&&b[0]!='n'||(a.length()>b.length())||(a.length()==b.length()&&a>b))&&!ent)
					ent=true,now=rep;
			}
			else if(rep>=0){
    
    //一定要>=0不然会RE
				ans=max(ans,tim),vis[nam[rep]]=0;
				if(add[rep])add[rep]=false,tim--;
				rep--;
				if(now>0&&rep<now)now=ent=0;
			}
			if(rep<0)puts("ERR"),n=-1;
		}
		if(rep>0)puts("ERR");
		else if(rep==0&&ans==sum)puts("Yes");
		else if(rep==0&&ans!=sum)puts("No");
	}
}




猜你喜欢

转载自blog.csdn.net/dhdhdhx/article/details/102907393
今日推荐