noip时间复杂度

大模拟题,十分毒瘤。看了题解调了很久,具体还是去看看dolao的题解
代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#define ll long long
#define rint register int
using namespace std;
stack<int> zhan;
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        int n;scanf("%d",&n);
        int nowline=0,pos=0;
        int Fcnt=0,Ecnt=0,cnt=0;
        int hisans=0,myans=0;
        int runflag=-1;
        bool endflag=false;
        string tmp;cin>>tmp;
        string sublist="0";
        for(rint i=0;i<tmp.length();++i)
            if(tmp[i]>='0'&&tmp[i]<='9')
            {
                hisans+=tmp[i]-'0';
                hisans*=10;
            }
        hisans/=10;
        if(tmp[2]=='1') hisans=0;
        for(rint i=1;i<=n;++i)
        {
            string sub,opt,tmpsta,tmpend;
            int sta=0,end=0;
            cin>>opt;
            if(opt=="F")
            {
                ++Fcnt;++pos;
                zhan.push(pos);
                cin>>sub>>tmpsta>>tmpend;
                if(tmpend[0]=='n'&& (!(tmpsta[0]=='n'&&tmpend[0]=='n'))) ++cnt;
                for(rint j=0;j<tmpsta.length();++j)
                {
                    sta+=tmpsta[j]-'0';
                    sta*=10;
                }
                sta/=10;
                if(tmpend[0]!='n')
                {//如果end是数字 
                    for(rint i=0;i<tmpend.length();++i)
                    {
                        end+=tmpend[i]-'0';
                        end*=10;
                    }
                    end/=10;
                    if(sta>end)//如果循环不能执行 
                        runflag=pos;
                }
                if(runflag==-1||pos<runflag) myans=max(myans,cnt);
                sublist+=sub;
                if(sublist.find(sub)!=sublist.length()-1)
                    printf("ERR\n");cnt=0;nowline=i;endflag=true;break;
                sta=0;end=0;
            }
            else if(opt=="E")
            {
                --cnt;++Ecnt;
                if(zhan.empty()&&!endflag)
                {
                    printf("ERR\n");cnt=0;nowline=i;endflag=true;break;
                }
                if(zhan.top()<=runflag)
                {
                    pos=0;
                    runflag=-1;
                }
                if(!zhan.empty()) zhan.pop();
                if(sublist.length()>0) sublist=sublist.substr(0,sublist.length()-1);
                if(zhan.empty()) cnt=0;
            }
        }
        if(endflag){
            cnt=0;
            while(!zhan.empty())
                zhan.pop();
                string cnm;
            for(rint i=1;i<=n-nowline+1;++i) getline(cin,cnm);
            continue;
        }
        if(Fcnt!=Ecnt)
        {
            if(!endflag) printf("ERR\n");
            while(!zhan.empty()) zhan.pop();
            cnt=0;
            continue;
        }
        while(!zhan.empty()) zhan.pop(); 
        if(!endflag){
            if(myans==hisans) printf("Yes\n");
            else printf("No\n");
        }
        myans=hisans=0;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值