20pts求调,好像读入了一些奇怪的东西
查看原帖
20pts求调,好像读入了一些奇怪的东西
352603
RainSpark楼主2023/11/17 07:33

#1 为本题样例,本地 freopen 和在线 IDE 均能输出正确结果,但是评测机上会 TLE。

记录

P5756_1.in

10 A+1
20 IF A=5 GO 60
60 END
30 A+2
40 A?
50 GO 20

P5756_1.out

11

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#define N (5005)
#define M (1005)
#define ll long long
#define INF (0x3f3f3f3f)
#define mod (998244353)
#define PII pair<int,int>
#define ls(xxx) (xxx)<<1
#define rs(xxx) (xxx)<<1|1
using namespace std;
#define END 0
#define GO 1
#define IF 2
#define OTHER 3
struct node{
	int line;
	int type;
	string opt_code;
	int jump_line;
	bool operator< (const node &x) const{
		return x.line>line;
	}
};
vector<node> code;
int str_to_int(string x){
	int t=0;
	for(char c:x){
		t=t*10+(c-'0');
	}
	return t;
}
void process(string x,int line){
	if(x.size()<=2) return;
//	int i=0;
	int i=1;
//	string str_line="";
//	for(;i<(int)x.size();i++){
//		if(!isdigit(x[i])) break;
//		str_line+=x[i];
//	}
//	int line=str_to_int(str_line);
//	i++;//ignore " "
	int code_type=-1,jump_line=0;
	string opt_code="",str_jump_line="";
	if(x[i]=='I' && x[i+1]=='F'){
		code_type=IF;
		i+=3;// "IF "
		for(;i<(int)x.size();i++){
			if(x[i]==' ') break;
			opt_code+=x[i];
		}
		i+=4;//ignore "GO " 妈了个逼的为什么要+4
		for(;i<(int)x.size();i++){
			str_jump_line+=x[i];
		}
//		cout<<"str_jump_line: "<<str_jump_line<<endl;
		jump_line=str_to_int(str_jump_line);
	}else if(x[i]=='E' && x[i+1]=='N' && x[i+2]=='D'){
		code_type=END;
		i+=3;// "END"
	}else if(x[i]=='G' && x[i+1]=='O'){
		code_type=GO;
		i+=3;// "GO "
		for(;i<(int)x.size();i++){
			str_jump_line+=x[i];
		}
		jump_line=str_to_int(str_jump_line);
	}else{
		code_type=OTHER;
		for(;i<(int)x.size();i++){
			opt_code+=x[i];
		}
	}
	code.push_back({line,code_type,opt_code,jump_line});
}
int ans,now;
map<string,int> var_map;
int line_map[N];
bool check(int x){
	string str_var="";
	int i=0;
	string opt_code=code[x].opt_code;
	for(;i<(int)opt_code.size();i++){
		if(opt_code[i]=='=') break;
		str_var+=opt_code[i];
	}
	i++;
	string str_val=""; int val;
	for(;i<(int)opt_code.size();i++){
		str_val+=opt_code[i];
	}
	val=str_to_int(str_val);
//	cout<<"check: "<<str_var<<"="<<var_map[str_var]<<", expected "<<val<<endl;
	return var_map[str_var]==val;
}
void change(int x){
	string str_var="";
	int i=0;
	string opt_code=code[x].opt_code;
	for(;i<(int)opt_code.size();i++){
		if(opt_code[i]=='+') break;
		if(opt_code[i]=='?') return;
		str_var+=opt_code[i];
	}
	i++;
	string str_val=""; int val;
	for(;i<(int)opt_code.size();i++){
		str_val+=opt_code[i];
	}
	val=str_to_int(str_val);
	var_map[str_var]+=val;
//	cout<<"change: "<<str_var<<"+="<<val<<endl;
//	cout<<"now "<<str_var<<"="<<var_map[str_var]<<endl;
}
void solve(){
	sort(code.begin(),code.end());
	now=code.front().line;
	for(int i=0;i<(int)code.size();i++){
		line_map[code[i].line]=i;
	}
	while(1){
		node now_code=code[line_map[now]];
		if(ans>=10000000){
			cout<<-1<<endl;
			exit(0);
		}
//		getchar();
//		cout<<"goto line: "<<now<<endl;
		if(now_code.type==END){
//			printf("type: END\n");
			ans++;
			break;
		}
		if(now_code.type==GO){
			now=now_code.jump_line;
//			printf("type: GO %d\n",now);
			ans++;
			continue;
		}
		if(now_code.type==IF){
//			printf("type: IF\n");
			if(check(line_map[now])){
				now=now_code.jump_line;
//				printf("TRUE, GO %d\n",now);
				ans++;
				continue;
			}else{
				now=code[line_map[now]+1].line;
//				printf("FALSE, GO %d\n",now);
				ans++;
				if(now==N-1) break;
				continue;
			}
		}
		if(now_code.type==OTHER){
			ans++;
			change(line_map[now]);
			now=code[line_map[now]+1].line;
//			printf("OTHER GO %d\n",now);
			continue;
		}
	}
}
int main(){
	freopen("P5756_1.in","r",stdin);
	string s;
	int line;
	while(cin>>line){
		getline(cin,s);
		process(s,line);
	}
	code.push_back({N-1,END,"",0});
//	cout<<"line\ttype\topt_code\tjump_line"<<endl;
//	for(node i:code){
//		cout<<i.line<<'\t'<<i.type<<'\t'<<i.opt_code<<'\t'<<i.jump_line<<endl;
//	}
	solve();
	
	cout<<ans<<endl;
    return 0;
}
2023/11/17 07:33
加载中...