非常神秘,手造样例都过了
//mysterious
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,opt,addr,last_addr,k,tot;
string t,n,s;
unordered_map <string,int> beg;
unordered_map <int,string> mp;
unordered_map <string,int> yingshe;
vector <pair<string,string> > v[110];//first->kind second->name
//beg[str] -> the begin ad of str
signed main(){
// freopen("struct.in","r",stdin);
// freopen("struct.out","w",stdout);
cin>>T;
while(T--){
cin>>opt;
if(opt==1){
int sss=0;
cin>>s>>k;
tot++;
yingshe[s]=tot;
for(int i=1;i<=k;i++){
cin>>t>>n;
v[tot].push_back({t,n});
if(t=="int") sss=max(sss,4ll);
if(t=="byte") sss=max(sss,1ll);
if(t=="long") sss=max(sss,8ll);
if(t=="short") sss=max(sss,2ll);
}
if(last_addr%sss!=0){
last_addr=(last_addr/sss+1)*sss;
}
else last_addr+=sss;
}
if(opt==2){
cin>>t>>n;
if(t=="int"){
if(last_addr%4!=0){
last_addr=(last_addr/4+1)*4;
}
for(int i=1;i<=4;i++){
mp[last_addr+i]=n;
}
beg[n]=last_addr;
last_addr+=4;
}
if(t=="byte"){
if(last_addr%1!=0){
last_addr=(last_addr/1+1)*1;
}
for(int i=1;i<=1;i++){
mp[last_addr+i]=n;
}
beg[n]=last_addr;
last_addr+=1;
}
else if(t=="long"){
if(last_addr%8!=0){
last_addr=(last_addr/8+1)*8;
}
for(int i=1;i<=8;i++){
mp[last_addr+i]=n;
}
beg[n]=last_addr;
last_addr+=8;
}
else if(t=="short"){
if(last_addr%2!=0){
last_addr=(last_addr/2+1)*2;
}
for(int i=1;i<=2;i++){
mp[last_addr+i]=n;
}
beg[n]=last_addr;
last_addr+=2;
}
else{//struct
for(auto y:v[yingshe[t]]){
string kindd=y.first;
string namme=y.second;
namme=t+"."+namme;
if(kindd=="int"){
if(last_addr%4!=0){
last_addr=(last_addr/4+1)*4;
}
for(int i=1;i<=4;i++){
mp[last_addr+i]=namme;
}
beg[namme]=last_addr;
last_addr+=4;
}
if(kindd=="byte"){
if(last_addr%1!=0){
last_addr=(last_addr/1+1)*1;
}
for(int i=1;i<=1;i++){
mp[last_addr+i]=namme;
}
beg[namme]=last_addr;
last_addr+=1;
}
else if(kindd=="long"){
if(last_addr%8!=0){
last_addr=(last_addr/8+1)*8;
}
for(int i=1;i<=8;i++){
mp[last_addr+i]=namme;
}
beg[namme]=last_addr;
last_addr+=8;
}
else if(kindd=="short"){
if(last_addr%2!=0){
last_addr=(last_addr/2+1)*2;
}
for(int i=1;i<=2;i++){
mp[last_addr+i]=namme;
}
beg[namme]=last_addr;
last_addr+=2;
}
}
}
}
if(opt==3){
string got="";
cin>>s;
bool f=false;
int len=s.size();
for(int i=0;i<len;i++){
if(f){
got.push_back(s[i]);
}
if(s[i]=='.'){
f=true;
}
}
if(!f)
cout<<beg[s]<<"\n";
else cout<<beg[got]<<"\n";
}
if(opt==4){
cin>>addr;
if(mp[addr].size()==0){
cout<<"ERR\n";
}
else cout<<mp[addr]<<"\n";
}
}
return 0;
}