zoukankan      html  css  js  c++  java
  • [NOIP2017] 时间复杂度 (模拟,栈)

    题目链接


    Solution

    用栈进行模拟.
    记录一个 (map) 来看循环变量有没有用过.
    对于每一次入栈都加信息.
    出栈直接将 (top) 减一下.
    反正一堆乱七八糟的东西瞎搞...
    注意条件如果循环内均为常数,算作 (O(1)).

    Code

    #include<bits/stdc++.h>
    using namespace std;
    const int inf=0x3f3f3f3f;
    map<char,bool>v;
    int sta[108],top,sum[108];
    char k[108];
    
    int cal(string s)
    {
        if(s=="n")return inf;
        int w=0,i=0;
        while(s[i]>='0'&&s[i]<='9')
        w=w*10+s[i]-'0',i++;
        return w;
    }
    
    int work(int n)
    {
        top=0; int flag=0,ans=1;
        for(char i='a';i<='z';i++)v[i]=0;
        while(n--)
        {
            char ch,i; string x,y;
            cin>>ch; sum[0]=1;
            if(ch=='F')
            {
                cin>>i;
                if(v[i])flag=-1; v[i]=1;
                cin>>x; cin>>y;
                if(flag==-1)continue;
                int w,x1=cal(x),y1=cal(y);
    
                if(x1==y1)w=1;
                if(x1>y1)w=0;
                if(x1<y1)
                {
                  if(x1==inf||y1==inf)
                    w=2;
                  else w=1;
                }
                sta[++top]=w; k[top]=i;
                if(w==1)sum[top]=sum[top-1];
                if(w==2)sum[top]=sum[top-1]+1;
                if(w==0)sum[top]=0;
                if(sum[top-1]==0)sum[top]=0;
                flag=max(flag,sum[top]);
            }
            if(ch=='E')
            {
                if(flag==-1)continue;
                v[k[top]]=0;
                top--;
            }
        }
        if(flag==0)flag++;
        if(top!=0)flag=-1;
        return flag-1;
    }
    
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int L,cost=0; string T;
            cin>>L>>T;
            if(T[2]=='1')cost=0;
            else{
              int i=0;
              while(T[i]>'9'||T[i]<'0')i++;
                while(T[i]>='0'&&T[i]<='9'){cost=cost*10+T[i]-'0';i++;}
            }
            int flag=work(L);
            if(flag<0)cout<<"ERR"<<endl;
            else
            if(flag==cost)cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
    }
    
    
    
  • 相关阅读:
    python thrift
    redis 知识点
    Spring其他注解和xml配置(不常用的)
    Spring常用的的注解以及对应xml配置详解
    Eureka的工作原理简介
    SpringBoot的自动配置实现和介绍
    SpringBoot多配置文件,切换环境
    数据卷介绍和常用的服务部署
    Spring Security简介
    在Java中入门,读取和创建Excel,Apache POI的使用
  • 原文地址:https://www.cnblogs.com/Kv-Stalin/p/9661110.html
Copyright © 2011-2022 走看看