码迷,mamicode.com
首页 > 其他好文 > 详细

NOIP2017 D1T2 时间复杂度

时间:2017-11-22 00:06:08      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:turn   时间复杂度   相同   中缀   ++   答案   style   str   space   

NOIP2017 D1T2 时间复杂度

本题用栈模拟,我感觉会写中缀表达式求值那种难度题的人就可以在NOIP上A了此题了。(虽然我挂了,凉了,我也要用嘶哑的声音呼喊出:这题真水)

用栈pop和push的时候 维护 有效循环层数、无效循环(l>r)层数、相同字母  ,每次退栈时更新答案,就OK了 。

还有就是字符串的读入和处理不能写挂。

(在判定ERR之后把剩下的东西读干净再走)

 

#include<bits/stdc++.h>
#define INF 1000000007
using namespace std;
int T,head,N,Map[200],cnt1,cnt2,res,ans;//cnt1有效循环 cnt2无效循环 
char s[50];
struct Node{
    char c;int a,b;
}Stack[200];
int getint(){
    int sum=0,i=0,len=strlen(s);
    while(s[i]<0||s[i]>9)i++;
    while(s[i]>=0&&s[i]<=9&&i<=len){sum=sum*10+s[i]-0;i++;}
    return sum;
}
void Pop(){
    Map[Stack[head].c-a+1]=0;
    if(Stack[head].a>Stack[head].b)cnt2--;
    if(Stack[head].b==INF&&Stack[head].a!=INF&&cnt2==0)cnt1--;
    head--;
}
void Push(Node x){
    Map[x.c-a+1]=1;
    if(x.a>x.b)cnt2++;
    else if(x.b==INF&&x.a!=INF&&cnt2==0)cnt1++,res=max(res,cnt1);
    Stack[++head]=x;
}
void ToError(int x){
    for(int i=x+1;i<=N;i++){
        scanf("%s",s);
        if(s[0]==F){scanf("%s",s);scanf("%s",s);scanf("%s",s);}
    }
}
int main()
{
    scanf("%d",&T);
    while(T--){
        while(head>0)Pop();
        res=0;
        scanf("%d%s",&N,s);
        if(s[2]==n){ans=getint();if(!ans)ans=1;}
        else ans=0;
        for(int i=1;i<=N;i++){
            scanf("%s",s);
            if(s[0]==F){
                Node x;
                scanf("%s",s);x.c=s[0];
                scanf("%s",s);
                if(s[0]==n)x.a=INF;else x.a=getint();
                scanf("%s",s);
                if(s[0]==n)x.b=INF;else x.b=getint();
                if(Map[x.c-a+1]){
                    ToError(i);
                    puts("ERR");goto New;
                }
                Push(x);
            }
            else{
                if(head==0){
                    ToError(i);
                    puts("ERR");goto New;
                }
                Pop();
            }
        }
        if(head>0)puts("ERR");
        else if(ans==res)puts("Yes");
        else puts("No");
        New:
    ;
    }
    return 0;    
} 

 

NOIP2017 D1T2 时间复杂度

标签:turn   时间复杂度   相同   中缀   ++   答案   style   str   space   

原文地址:http://www.cnblogs.com/Elfish/p/7875433.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!