玄关,求助S组T3,大样例3个都过,洛谷70pts,非考场代码(考场思路+重构)
  • 板块学术版
  • 楼主ZnPdCo
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/25 13:34
  • 上次更新2023/11/2 11:28:56
查看原帖
玄关,求助S组T3,大样例3个都过,洛谷70pts,非考场代码(考场思路+重构)
560700
ZnPdCo楼主2023/10/25 13:34

求助S组T3,大样例3个都过,洛谷70pts,非考场代码(考场思路+重构),玄关

#include <bits/stdc++.h>
#define ll long long
#define rt structs[0]
using namespace std;
struct element {
	string name;
	ll id, st, ed;
};
struct node {
	string name = "";
	vector <element> son;
	ll kind = 0, siz = 0, ti = 0;
	bool flag = false;
	
	inline void align(ll align_kind) {
		if(ti % align_kind != 0)
			ti += (align_kind - ti % align_kind);
	}
};
vector<node> structs;

ll n;

void init();
void op_1();
void op_2();
void op_3();
void op_4();
ll name2id(string type);
void path2addr(ll x, ll pos, ll shift, vector<string> s);
void addr2path(ll addr, ll pos, string path);

int main() {
//	freopen("struct.in", "r", stdin);
//	freopen("struct.out", "w", stdout);
	init();
	cin >> n;
	while(n--) {
		ll op;
		cin >> op;
		switch(op) {
			case 1: {
				op_1();
				break;
			}
			case 2: {
				op_2();
				break;
			}
			case 3: {
				op_3();
				break;
			}
			case 4: {
				op_4();
				break;
			}
		}
	}
} 


void init() {
	node a1;
	structs.push_back(a1);
	
	node a2;
	a2.flag = 1;
	a2.name = "byte";
	a2.siz = a2.kind = 1;
	structs.push_back(a2);
	
	node a3;
	a3.flag = 1;
	a3.name = "short";
	a3.siz = a3.kind = 2;
	structs.push_back(a3);
	
	node a4;
	a4.flag = 1;
	a4.name = "int";
	a4.siz = a4.kind = 4;
	structs.push_back(a4);
	
	node a5;
	a5.flag = 1;
	a5.name = "long";
	a5.siz = a5.kind = 8;
	structs.push_back(a5);
}
void op_1() {
	node qwq;
	ll k;
	cin >> qwq.name >> k;
	
	for(ll i = 1; i <= k; i++) {
		element one;
		string type;
		cin >> type >> one.name;
		one.id = name2id(type);
		
		qwq.align(structs[one.id].kind);
		one.st = qwq.ti;
		qwq.ti += structs[one.id].siz;
		one.ed = qwq.ti - 1;
		
		qwq.kind = max(qwq.kind, structs[one.id].kind);
		qwq.son.push_back(one);
	}
	qwq.align(qwq.kind);
	qwq.siz = qwq.ti;
	
	structs.push_back(qwq);
	
	cout << qwq.siz << ' ' << qwq.kind << '\n';
}
void op_2() {
	element one;
	string type;
	cin >> type >> one.name;
	one.id = name2id(type);
	
	rt.align(structs[one.id].kind);
	one.st = rt.ti;
	rt.ti += structs[one.id].siz;
	one.ed = rt.ti - 1;
	
	rt.kind = max(rt.kind, structs[one.id].kind);
	rt.son.push_back(one);
	
	cout << one.st << '\n';
}
void op_3() {
	string path;
	cin >> path;
	
	vector<string> path_vec;
	string _ = "";
	
	for(ll i = 0; i < path.length(); i++) {
		if(path[i] == '.') {
			path_vec.push_back(_);
			_ = "";
		} else {
			_.push_back(path[i]);
		}
	}
	path_vec.push_back(_);
	
	path2addr(0, 0, 0, path_vec);
}
void op_4() {
	ll addr;
	cin >> addr;
	
	addr2path(addr, 0, "");
}
ll name2id(string type) {
	for(ll i = 0; i < structs.size(); i++) {
		if(structs[i].name == type) {
			return i;
		}
	}
	return -1;
}

void path2addr(ll x, ll pos, ll shift, vector<string> s) {
	for(ll i = 0; i < structs[pos].son.size(); i++) {
		if(structs[pos].son[i].name == s[x]) {
			if(x == s.size() - 1) {
				cout << shift + structs[pos].son[i].st << '\n';
				return;
			}
			path2addr(x+1, structs[pos].son[i].id, shift + structs[pos].son[i].st, s);
			return;
		}
	}
}
void addr2path(ll addr, ll pos, string path) {
	for(ll i = 0; i < structs[pos].son.size(); i++) {
		if(structs[pos].son[i].st <= addr && addr <= structs[pos].son[i].ed) {
			if(structs[structs[pos].son[i].id].flag) {
				cout << path + '.' + structs[pos].son[i].name << '\n';
				return;
			}
			if(pos != 0)
				addr2path(addr - structs[pos].son[i].st, structs[pos].son[i].id, path + '.' + structs[pos].son[i].name);
			else
				addr2path(addr - structs[pos].son[i].st, structs[pos].son[i].id, structs[pos].son[i].name);
			return;
		}
	}
	cout << "ERR\n";
}
2023/10/25 13:34
加载中...