#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <queue>
#include <string>
#include <unordered_map>
#include <vector>
using namespace std;
// ifstream cin("struct.in");
// ofstream cout("struct.out");
struct struMember {
string type, name;
long long startit;
};
struct stru {
string name;
long long size;
long long startit;
int stdp;
unordered_map<string, int> memberNameHash;
vector<struMember> member;
};
struct gvar {
string type, name;
long long startit;
};
unordered_map<string, int> struNameHash;
vector<stru> struList;
unordered_map<string, int> gvarNameHash;
vector<gvar> ctx;
long long alignIt(int stdp, long long it) {
int md = it % stdp;
if (md == 0) {
return it;
}
return it - md + stdp;
}
void printAllStru() {
cout << "Struct Debug:" << endl;
for (auto t : struList) {
cout << "Struct name: " << t.name << ", size: " << t.size << ", stdp: " << t.stdp << endl;
for (auto m : t.member) {
cout << " type: " << m.type << ", name: " << m.name << ", startit: " << m.startit << endl;
}
}
cout << endl;
}
void init() {
struNameHash.clear();
struList.clear();
gvarNameHash.clear();
ctx.clear();
stru tstru;
tstru.name = "byte";
tstru.size = 1;
tstru.startit = 0;
tstru.stdp = 1;
tstru.member.clear();
tstru.memberNameHash.clear();
struNameHash[tstru.name] = struList.size();
struList.push_back(tstru);
tstru.name = "short";
tstru.size = 2;
tstru.startit = 0;
tstru.stdp = 2;
tstru.member.clear();
tstru.memberNameHash.clear();
struNameHash[tstru.name] = struList.size();
struList.push_back(tstru);
tstru.name = "int";
tstru.size = 4;
tstru.startit = 0;
tstru.stdp = 4;
tstru.member.clear();
tstru.memberNameHash.clear();
struNameHash[tstru.name] = struList.size();
struList.push_back(tstru);
tstru.name = "long";
tstru.size = 8;
tstru.startit = 0;
tstru.stdp = 8;
tstru.member.clear();
tstru.memberNameHash.clear();
struNameHash[tstru.name] = struList.size();
struList.push_back(tstru);
}
void addStru() {
int num;
stru tstru;
tstru.memberNameHash.clear();
tstru.member.clear();
tstru.startit = 0;
tstru.size = 0;
tstru.stdp = 0;
cin >> tstru.name >> num;
tstru.member.resize(num);
for (int i = 0; i < num; i++) {
cin >> tstru.member[i].type >> tstru.member[i].name;
tstru.memberNameHash[tstru.member[i].name] = i;
stru memberStru = struList[struNameHash[tstru.member[i].type]];
tstru.member[i].startit = alignIt(memberStru.stdp, tstru.size);
tstru.stdp = max(tstru.stdp, memberStru.stdp);
tstru.size = tstru.member[i].startit + memberStru.size;
}
tstru.size = alignIt(tstru.stdp, tstru.size);
struNameHash[tstru.name] = struList.size();
struList.push_back(tstru);
cout << tstru.size << " " << tstru.stdp << endl;
}
void addVar() {
gvar tvar;
cin >> tvar.type >> tvar.name;
long long startit = 0;
if (ctx.size() != 0) {
startit = ctx.back().startit + struList[struNameHash[ctx.back().type]].size;
}
stru tstru = struList[struNameHash[tvar.type]];
tvar.startit = alignIt(tstru.stdp, startit);
gvarNameHash[tvar.name] = ctx.size();
ctx.push_back(tvar);
cout << tvar.startit << endl;
}
void findVar() {
string path;
queue<string> vars;
while (!vars.empty()) {
vars.pop();
}
cin >> path;
// split
for (int i = 0; i < path.size(); i++) {
if (path[i] == '.') {
vars.push(path.substr(0, i));
path = path.substr(i + 1);
}
}
vars.push(path);
long long startit = ctx[gvarNameHash[vars.front()]].startit;
stru tstru = struList[struNameHash[ctx[gvarNameHash[vars.front()]].type]];
vars.pop();
while (!vars.empty()) {
struMember m = tstru.member[tstru.memberNameHash[vars.front()]];
startit += m.startit;
tstru = struList[struNameHash[m.type]];
vars.pop();
}
cout << startit << endl;
}
// 原本准备用二分,但是费时间,就没写
void findMem() {
long long beginit;
string lastType = "";
string path = "";
cin >> beginit;
stru tstru;
bool finded = false;
for (auto t : ctx) {
if (t.startit <= beginit && beginit < t.startit + struList[struNameHash[t.type]].size) {
path += t.name;
beginit -= t.startit;
tstru = struList[struNameHash[t.type]];
finded = true;
lastType = t.type;
break;
}
}
if (!finded) {
cout << "ERR" << endl;
return;
}
while (tstru.member.size() != 0) {
finded = false;
for (auto t : tstru.member) {
if (t.startit <= beginit && beginit < t.startit + struList[struNameHash[t.type]].size) {
path += "." + t.name;
beginit -= t.startit;
tstru = struList[struNameHash[t.type]];
finded = true;
lastType = t.type;
break;
}
}
if (!finded) {
cout << "ERR" << endl;
return;
}
}
if (lastType != "byte" && lastType != "short" && lastType != "int" && lastType != "long") {
cout << "ERR" << endl;
return;
}
cout << path << endl;
}
int main() {
init();
int n;
cin >> n;
while (n--) {
int t;
cin >> t;
if (t == 1) {
addStru();
} else if (t == 2) {
addVar();
} else if (t == 3) {
findVar();
} else {
findMem();
}
// printAllStru();
}
}
发现北京80中的考试没断网