提交记录
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct Value{
string type,name;
};
int n;
long long pos=-1,lsSize;
string ans="";
unordered_map<string,long long> valCnt;
unordered_map<string,long long> alignStd;
unordered_map<string,long long> typeSize;
unordered_map<string,vector<Value>> strVal;
unordered_map<string,unordered_map<string,long long>> addPos;
unordered_map<string,long long> startPos;
unordered_map<string,string> typeOf;
void init(){
typeSize["byte"]=alignStd["byte"]=1;
typeSize["short"]=alignStd["short"]=2;
typeSize["int"]=alignStd["int"]=4;
typeSize["long"]=alignStd["long"]=8;
}
void newStruct(){
string strName;
int kCnt;
cin>>strName>>kCnt;
valCnt[strName]=kCnt;
for(int i=1;i<=kCnt;i++){
string type,name;
cin>>type>>name;
alignStd[strName]=max(alignStd[strName],alignStd[type]);
strVal[strName].push_back({type,name});
}
addPos[strName][strVal[strName][0].name]=0;
typeOf[strName+"."+strVal[strName][0].name]=strVal[strName][0].type;
long long o=0,s=typeSize[strVal[strName][0].type];
for(int i=1;i<kCnt;i++){
string type=strVal[strName][i].type;
string name=strVal[strName][i].name;
long long a=alignStd[type];
o=ceil(1.0*(o+s)/a)*a;
addPos[strName][name]=o;
s=typeSize[type];
typeOf[strName+"."+name]=type;
}
typeSize[strName]=ceil(1.0*(o+s)/alignStd[strName])*alignStd[strName];
cout<<typeSize[strName]<<' '<<alignStd[strName]<<'\n';
}
void newValue(){
string type,name;
cin>>type>>name;
if(pos==-1){
pos=0;
}else{
pos=ceil(1.0*(pos+lsSize)/alignStd[type])*alignStd[type];
}
lsSize=typeSize[type];
startPos[name]=pos;
typeOf[name]=type;
cout<<startPos[name]<<'\n';
}
long long dfs1(vector<string>&vs,int id){
if(id==vs.size()-1){
return addPos[typeOf[typeOf[vs[id-2]]+"."+vs[id-1]]][vs[id]];
}
if(id==1){
return addPos[typeOf[vs[id-1]]][vs[id]]+dfs1(vs,id+1);
}
return addPos[typeOf[typeOf[vs[id-2]]+"."+vs[id-1]]][vs[id]]+dfs1(vs,id+1);
}
void getAddr(){
string val;
cin>>val;
vector<string> vs;
string tmp;
for(int i=0;i<val.size();i++){
if(val[i]=='.'){
vs.push_back(tmp);
tmp="";
}else{
tmp+=val[i];
}
}
vs.push_back(tmp);
if(vs.size()==1){
cout<<startPos[vs[0]]<<'\n';
}else if(vs.size()==2){
cout<<startPos[vs[0]]+addPos[typeOf[vs[0]]][vs[1]]<<'\n';
}else{
cout<<startPos[vs[0]]+dfs1(vs,1)<<'\n';
}
}
void dfs2(string before,string name,long long addr,long long st){
string type=before==""?typeOf[name]:typeOf[before+"."+name];
if(type=="byte"||type=="short"||type=="int"||type=="long"){
return;
}
long long start=before==""?startPos[name]:st+addPos[before][name];
bool none=true;
for(int i=0;i<strVal[type].size();i++){
string cType=strVal[type][i].type;
string cName=strVal[type][i].name;
long long addP=addPos[type][cName];
long long size=typeSize[cType];
if(start+addP<=addr&&addr<start+addP+size){
ans+="."+cName;
none=false;
dfs2(type,cName,addr,start);
break;
}
}
if(none){
ans="ERR";
}
}
void getValue(){
long long addr;
cin>>addr;
string bName;
bool none=true;
for(auto &p:startPos){
string name=p.first;
string type=typeOf[name];
long long size=typeSize[type];
long long pos=p.second;
if(pos<=addr&&addr<pos+size){
bName=name;
none=false;
break;
}
}
if(none){
cout<<"ERR\n";
return;
}
ans=bName;
dfs2("",bName,addr,0);
cout<<ans<<'\n';
}
signed main(){
cin.tie(nullptr)->sync_with_stdio(false);
init();
cin>>n;
for(int i=1,op;i<=n;i++){
cin>>op;
if(op==1){
newStruct();
}else if(op==2){
newValue();
}else if(op==3){
getAddr();
}else{
getValue();
}
}
return !~(0^0);
}