#include<bits/stdc++.h>
#define int long long
using namespace std;
constexpr int N=101;
int n,op,k,new_place;
string s;
struct Type{
string name;
int size,memory;//size大小 memory对齐
vector<tuple<string,string,int> >vec;
map<string,int>var_id;
void init(){
for(int i=0;i<vec.size();i++)
var_id[get<1>(vec[i])]=i;
return;
}
};
vector<tuple<string,string,int> >vec;
vector<Type>structure;
map<string,int>struct_id,var_id;
vector<tuple<string,string,int> >global;
string get_first(string&s){
int len=s.find('.');
if(len==s.npos){
string t=s;
s="";
return t;
}
string first=s.substr(0,len);
s=s.substr(len+1,s.size()-len-1);
return first;
}
int find(tuple<string,string,int>var,string cmd,int add){
// cerr<<get<0>(var)<<' '<<get<1>(var)<<' '<<get<2>(var)<<' '<<cmd<<'\n';
Type&type=structure[struct_id[get<0>(var)]];
string first=get_first(cmd),tmp;
assert(type.var_id[first]<type.vec.size());
tuple<string,string,int>variable=type.vec[type.var_id[first]];
add+=get<2>(var);
//exit(1);
tmp=get<0>(variable);
if(tmp=="byte"||tmp=="short"||tmp=="int"||tmp=="long")
return add+get<2>(variable);
return find(variable,cmd,add);
}
string get_var(tuple<string,string,int>var,int addr){
// cerr<<get<0>(var)<<' '<<get<1>(var)<<' '<<get<2>(var)<<' '<<addr<<'\n';
string ret=get<1>(var);
string type_name=get<0>(var);
if(type_name=="byte"||type_name=="short"||type_name=="int"||type_name=="long"){
if(addr<structure[struct_id[type_name]].size)
return ret;
else
return"ERR";
}
Type&type=structure[struct_id[type_name]];
int l=0,r=type.vec.size()-1,mid;
if(l>r)
return"ERR";
while(l<r){
mid=(l+r+1)>>1;
if(get<2>(type.vec[mid])>addr)
r=mid-1;
else
l=mid;
}
string new_var=get_var(type.vec[l],addr-get<2>(type.vec[l]));
if(new_var=="ERR")
return"ERR";
else
return ret+(string)"."+new_var;
}
signed main(){
Type type;
type.size=type.memory=1;
type.name="byte";
structure.push_back(type),struct_id[type.name]=0;
type.size=type.memory=2;
type.name="short";
structure.push_back(type),struct_id[type.name]=1;
type.size=type.memory=4;
type.name="int";
structure.push_back(type),struct_id[type.name]=2;
type.size=type.memory=8;
type.name="long";
structure.push_back(type),struct_id[type.name]=3;
for(cin>>n;n;--n){
cin>>op;
if(op==1){
cin>>s>>k;
int mem=0,siz=0;
string typ,nam;
vec.resize(k);
for(int i=0;i<k;i++){
cin>>typ>>nam;
Type&type=structure[struct_id[typ]];
mem=max(mem,type.memory);
if(siz%type.memory)
siz=(siz/type.memory+1)*type.memory;
vec[i]=make_tuple(typ,nam,siz);
siz+=type.size;
}
Type newtype;
newtype.name=s,newtype.memory=mem,newtype.size=siz;
newtype.vec=vec;
newtype.init();
structure.push_back(newtype);
struct_id[s]=structure.size()-1;
cout<<siz<<' '<<mem<<'\n';
}
if(op==2){
string typ,nam;
cin>>typ>>nam;
Type&type=structure[struct_id[typ]];
if(new_place%type.memory)
new_place=(new_place/type.memory+1)*type.memory;
global.push_back(make_tuple(typ,nam,new_place));
cout<<new_place<<'\n';
new_place+=type.size;
var_id[nam]=global.size()-1;
}
if(op==3){
string cmd,first;
cin>>cmd;
first=get_first(cmd);
cout<<find(global[var_id[first]],cmd,0)<<'\n';
}
if(op==4){
int addr,l=0,r=global.size()-1,mid;
cin>>addr;
if(l>r){
cout<<"ERR\n";
continue;
}
while(l<r){
mid=(l+r+1)>>1;
if(get<2>(global[mid])>addr)
r=mid-1;
else
l=mid;
}
cout<<get_var(global[l],addr-get<2>(global[l]))<<'\n';
}
}
return 0;
}
使用结构体 Type 存储题目中的结构体,用 tuple 存储变量(type,name,place 的方式)
这里 place 指的是在当前结构体(全局)中的内存
比如 struct1 a其中 a 的内存是 2 ,a.b 的内存是 2+b的内存