NOIP 2017 時間複雜度 (模擬)

題目大意:略

傻了吧唧的我wa了好幾次

我的模擬功底真的不咋地

linux下用gets會報錯,我用的fgets

#include <string>
#include "stdio.h"
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long 
#define N 1010
#define rint register int
#define ll long long 
#define il inline
#define idx(x) (x-'a'+1)
#define idg(x) (x-'0')
using namespace std;
//re
int T,n,cnt,j;
int use[30];
char str[110][20];
inline bool isdig(char c)
{return ('0'<=c&&c<='9')?1:0;}
int dfs()
{
    int ans=0,now=j,val=0,cal=0;
    if(str[j][0]=='E') return -1;
    if(str[j][0]=='F')
    {
        if(use[idx(str[j][2])])
            return -1;
        use[idx(str[j][2])]=1;
        while(str[j+1][0]=='F')
        {
            j++,cal=dfs();
            if(cal==-1) return -1;
            ans=max(ans,cal);
        }  
        int k=4;
        while(isdig(str[now][k]))
            val=val*10+idg(str[now][k]),k++; 
        k++;
        if(str[now][4]=='n'){
            if(str[now][6]!='n') ans=0;
        }else if(!isdig(str[now][k])){
            ans++;
        }else{
            int w=0;
            while(isdig(str[now][k]))
                w=w*10+idg(str[now][k]),k++;
            if(val>w) ans=0;
        }
    }
    use[idx(str[now][2])]=0;
    j++;
    if(str[j][0]!='E') return -1;
    else return ans;
}

int main()
{
    //freopen("complexity6.in","r",stdin);
    scanf("%d",&T);
    for(int t=1;t<=T;t++)
    {
        int q=0;
        scanf("%d",&n);
        memset(str,0,sizeof(str));
        memset(use,0,sizeof(use));
        scanf("%s\n",str[0]);
        for(int i=1;i<=n;i++)
            fgets(str[i],20,stdin);
        int ret=0,ans=0;j=1;
        for(;j<=n;j++){
            ans=dfs();
            if(ans==-1){ret=-1;printf("ERR\n");break;}
            else {ret=max(ret,ans);}
        }
        if(ret==-1) continue;
        int k=0,flag=0;
        while(1){
            if(str[0][k]=='n') flag=1;
            if(!isdig(str[0][k]))
                {k++;continue;}
            while(isdig(str[0][k]))
                q=q*10+idg(str[0][k]),k++;
            break;
        }
        if(flag==0) q=0;
        if(ret==q) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章