92pts模拟求调

P2830 写程序

yszkddzyh @ 2023-02-01 21:15:59

WA第五个点,第一行输出了-1

#include <iostream>
#include <cstring>
#include <map>
#define N 101
using namespace std;
map<string,map<int,int> >val;
map<string,int>len;
map<string,bool>init_;
char s[N];
int f(char* str){
    int l=strlen(str),p=0;
    for(int i=0;i<l;i++){
        if(str[i]<'0'||str[i]>'9') goto flag;
        else p=p*10+((int)str[i]-'0');
    }
    return p;
    flag:
    char name[N]="",index[N]="";
    int tot=0;
    for(p=0;p<l&&str[p]!='[';p++) name[p]=str[p];
    for(int i=p+1;i<l-1;i++) index[tot++]=str[i];
    int tmp=f(index);
    if(init_[name]&&tmp>=len[name]) printf("-1"),exit(0);
    return val[name][tmp];
}
int main(){
    while(true){
        int l=0;
        char c;
        while(c=getchar()){//因为Linux换行符的问题,我手写的输入
            if(c=='\n') l++;
            if(c=='\n'||c==EOF) break;
            if((c>='0'&&c<='9')||(c>='A'&&c<='Z')||(c>='a'&&c<='z')||c==' '||c=='['||c==']') s[l++]=c;
        }
        if(!l) return 0;
        if(s[0]=='i'&&s[1]=='n'&&s[2]=='t'){
            char name[N]="",id[N]="";
            int i,tot=0;
            for(i=4;i<l&&s[i]!='[';i++) name[i-4]=s[i];
            for(int j=i+1;j<l-2;j++) id[tot++]=s[j];
            len[name]=f(id),init_[name]=true;
        }
        else if(s[0]=='c'&&s[1]=='o'&&s[2]=='u'&&s[3]=='t'){
            char sub[N]="";
            for(int i=5;i<l;i++) sub[i-5]=s[i];
            printf("%d\n",f(sub));
        }
        else if((s[0]>='A'&&s[0]<='Z')||(s[0]>='a'&&s[0]<='z')){
            char name[N]="",id[N]="",sub1[N]="";
            int i,space;
            for(i=0;i<l&&s[i]!='[';i++) name[i]=s[i];
            for(space=i+2;space<l&&s[space]!=' ';space++);
            for(int j=i+1,tot=0;j<space-1;j++) id[tot++]=s[j];
            for(int j=space+1,tot=0;j<l;j++) sub1[tot++]=s[j];
            int t1=f(id);
            if(t1>=len[name]) printf("-1"),exit(0);
            val[name][t1]=f(sub1);
        }
        else exit(0);
        memset(s,0,sizeof(s));
    }
    return 0;
}

|