92pts模拟求调
  • 板块P2830 写程序
  • 楼主yszkddzyh
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/2/1 21:15
  • 上次更新2023/10/24 02:09:15
查看原帖
92pts模拟求调
737158
yszkddzyh楼主2023/2/1 21:15

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;
}
2023/2/1 21:15
加载中...