求助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";
}