2 条题解

  • 1
    @ 2022-8-21 22:19:02
    #include<cstdio>
        #include<stack>
        #include<string>
        #include<iostream>
        #include<algorithm>
        using namespace std;
        
        const int maxl=105;
        
        int t,l,w;
        string o;
        string code[maxl];
        
        int sread(int &x,string c) {
            int res=0;
            int len=c.size();
            while(c[x]<'0' || c[x]>'9'&&x<c.size()) {
                if(c[x]=='n'){
                    ++x;
                    return 1000000;
                }
                ++x;
            }
            while(c[x]>='0' && c[x]<='9') {
                res*=10;res+=c[x]-'0';
                ++x;
            }
            return res;
        }
        
        int geto() {
            int res=0,x=3;
            int len=o.size();
            if(o[2]=='n') res=sread(x,o);
            else res=0;
            return res;
        }
        
        int check() {
            int res=0,now=0;
            int a,b,x;
            stack<int> s;
            int flag=-1;
            bool ins[26]={0};
            bool ef[26]={0};
            for(int i=1;i<=l;i++) {
                if(code[i][0]=='F') {
                    int k=code[i][2]-'a';
                    if(ins[k]) return -1;
                    s.push(k);ins[k]=true;
                    x=4;
                    a=sread(x,code[i]);b=sread(x,code[i]);
                    //printf("a:%d  b:%d\n",a,b);
                    if(b-a>1000) {
                        //cout<<"##"<<(char)(k+'a')<<"##"<<endl;
                        if(flag==-1) {
                            now++;
                            res=max(res,now);
                            ef[k]=true;
                        }
                    }
                    if(a>b) {
                        if(flag==-1) flag=k;
                    }
                }
                if(code[i][0]=='E') {
                    if(s.empty()) return -1;
                    int k=s.top();
                    s.pop();ins[k]=false;
                    if(flag==k) flag=-1;
                    if(ef[k]) {
                        ef[k]=false;
                        now--;
                    }
                }
            }
            if(s.size()) return -1;
            return res;
        }
        
        int main() {
            //freopen("s.txt","w",stdout);
            scanf("%d",&t);
            while(t--) {
                int ww;
                scanf("%d ",&l); getline(cin,o);
                w=geto();
                //printf("w:%d\n",w);
                for(int i=1;i<=l;i++) getline(cin,code[i]);
                //for(int i=1;i<=l;i++) cout<<code[i]<<"###\n";
                ww=check();
                //printf("ww:%d\n",ww);
                //cout<<o<<"##\n";
                if(ww==-1) puts("ERR");
                else {
                    if(ww==w) puts("Yes");
                    else puts("No");
                }
            }
        }
    
    • -2
      @ 2021-10-15 16:01:19
      //时间复杂度
      #include<bits/stdc++.h>
      using namespace std;
      const int inf=0x7fffffff;
      int t,l;
      
      int getVal( )
      {
      	int tmp=0;
      	string si;
      	stringstream so; //字符串流,可以转类型
      	cin>>si;
      	if(si[0]=='n')
      		return inf; //n返回极大值inf
      	else
      	{//常数则返回实际值
      		so<<si; //把字符串输入流
      		so>>tmp; //把流输出到对应类型,完成类型转换
      	}	
      	return tmp;	
      } 
      
      void getAns( )
      {
      	char fe,sn[101]={'#'}; //栈底用'#'填充
      	bool bc=0; //判断是否为n^w次方,区分【O(1)和O(n^1)】
      	map<string,int> mp; //变量判重 
      	//朱天宇同学建议用Hash法,char vis[26],进行变量判重很好的 
      	int tf=1,tn=0,mw=0,flag=0,w=0,x,y;
      	string val;
      	scanf("%d",&l);
      	cin>>val;
      	for(int i=0;val[i]!=')';++i)
      	{//取复杂度指数w
      		if(val[i]=='^') bc=1;
      		if(val[i]>'9' || val[i]<'0') continue;
      		w=w*10+val[i]-'0';
      	}	
      	for(int i=0;i<l;++i)
      	{
      		if(flag<10)
      		{//语法错误,复杂度统计出错,会修改标记flag为10
      			cin>>fe;
      			if(fe=='F')
      			{//行首字符判定,'F'入栈,'E'出栈
      				tf++; //入栈				
      				cin>>val; //读入循环控制变量
      				if(mp.count(val)==0) //变量判重
      					mp[val]=1; //不冲突存入map,备查
      				else				
      					flag=10; //冲突修改标记				
      				x=getVal(); //读入循环左边界
      				y=getVal();	//读入循环有边界			
      				if(x<y) 
      				{//可以循环多次
      					if(y==inf)
      					{//y为n,此轮为n次循环
      						if(sn[tf-2]!='0')
      						{//上一次为正常循环,标记为n
      							sn[tf-1]='n';
      							tn++; //实际循环指数增加
      							mw=max(mw,tn); //求最大实际循环指数	
      						}							
      						else //上一轮循环不正常,此轮继续无效
      							sn[tf-1]='0';
      					}
      					else if(sn[tf-2]=='0') //上一轮循环不正常,此轮继续无效
      						sn[tf-1]='0';
      					else //此轮为常数次循环,正常标记为1
      						sn[tf-1]='1';
      					
      				}
      				else if(x==y) //此轮为常数次循环,正常标记为1
      					sn[tf-1]='1';
      				else //x>y,非正常循环,标记为0
      					sn[tf-1]='0';
      			}
      			else
      			{
      				tf--; //出栈
      				if(sn[tf]=='n') //n出栈,循环指数要减小
      					tn--;
      				if(tf==1) mp.clear( ); //栈为空,清空变量判重map
      			}
      			getchar(); //过滤行末换行符
      		}
      		else 
      		{//已经确定出错,结果为ERR,剩下的行,直接按行读取,不加判断
      			getline(cin,val);			
      		}
      	}
      	if(tf!=1) flag=10; //栈不空,F-E不配对出错
      	if(bc==0 && mw==0) mw=1; //常数次循环,校正mw
      	if(flag==10) puts("ERR"); //错误
      	else
      	{
      		if(w==mw) puts("Yes"); 
      		else puts("No");
      	}
      }
      int main( )
      {	
      	scanf("%d",&t);
      	while(t--)
      	{
      		getAns();		
      	}
      	return 0;	
      } 
      
      /* 自造测试数据,是一种编程技能。超大数据时难以调试的
      ** 况且有时候,特殊刁钻数据不会给出,得自己想到
      15
      
      6 O(1)
      F i n 10
      F j 2 100
      F k 5 n
      E
      E
      E
      
      6 O(n^1)
      F i 10 n
      F j n 2
      F i 5 n
      E
      E
      E
      
      6 O(n^1)
      F i 10 n
      F j n 2
      E
      E
      F i 5 n
      E
      
      */
      
      • @ 2021-10-15 16:02:00

        普通题解,大佬轻喷

    • 1

    信息

    ID
    72
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    21
    已通过
    5
    上传者