0pts 求调
查看原帖
0pts 求调
1226952
Cosine_Func楼主2024/10/7 11:24
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define endl '\n'
#define itn int
#define pi pair<int,int>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define int ll
using namespace std;
const int MOD1=1e9+7;
const int MOD2=998244353;
const int N=2e2+5;
struct Child{
	int begin_pos,tid;
};
struct Struct{
	itn size,align;
	map<string,Child> children;
}st[N];
struct Variable{
	int begin_pos,tid;
};
itn q,op,cnt=4,_size;
map<string,int> structs;
map<string,Variable> var;
inline int calc(int x,itn y){
	return (x+y-1)/y*y;
}
inline void Solve(){
	cin>>q;
	st[0].size=st[0].align=1;
	st[1].size=st[1].align=2;
	st[2].size=st[2].align=4;
	st[3].size=st[3].align=8;
	structs["byte"]=0;
	structs["short"]=1;
	structs["int"]=2;
	structs["long"]=3;
	while(q--){
		cin>>op;
		if(op==1){
			int k;
			string t,n,s;
			cin>>s>>k;
			Struct &_=st[cnt];
			for(int i=1;i<=k;i++){
				cin>>t>>n;
				int tid=structs[t];
				int size=st[tid].size;
				int align=st[tid].align;
				_.size=calc(_.size,align);
				_.align=max(_.size,align);
				_.children[n]={_.size,tid};
				_.size+=size;
			}
			_.size=calc(_.size,_.align);
			structs[s]=cnt;
			cnt++;
			cout<<_.size<<' '<<_.align<<endl;
		}
		if(op==2){
			string t,n;
			cin>>t>>n;
			int tid=structs[t];
			_size=calc(_size,st[tid].align);
			var[n]={tid,_size};
			cout<<_size<<endl;
			_size+=st[tid].size;
		}
		if(op==3){
			string s;
			cin>>s;
			vector<string> v;
			int pos;
			while(pos=s.find('.')!=-1){
				v.pb(s.substr(0,pos));
				s=s.substr(pos+1,s.size()-pos-1); 
			}
			v.pb(s);
			int tid=var[v[0]].tid;
			itn addr=var[v[0]].begin_pos;
			v.erase(v.begin());
			for(string sub:v){
				Child ch=st[tid].children[sub];
				tid=ch.tid;
				addr+=ch.begin_pos; 
			}
			cout<<addr<<endl;
		}
		if(op==4){
			itn addr;
			cin>>addr;
			int begin_pos=0;
			itn tid=-1;
			string name;
			vector<string> v;
			for(auto it:var){
				int pos=it.second.begin_pos;
				if(pos<=addr and pos>=begin_pos){
					begin_pos=pos;
					tid=it.second.tid;
					name=it.first;
				}
			}
			if(tid==-1 or addr-begin_pos>=st[tid].size){
				cout<<"ERR"<<endl;
				return;
			}
			string vname=name;
			while(!st[tid].children.empty()){
				addr-=begin_pos;
				begin_pos=0;
				int nid=-1;
				for(auto it:st[tid].children){
					int pos=it.second.begin_pos;
					if(pos<=addr and pos>=begin_pos){
						begin_pos=pos;
						nid=it.second.tid;
						name=it.first;
					}
				}
				if(nid==-1 or addr-begin_pos>=st[nid].size){
					cout<<"ERR"<<endl;
					return;
				}
				v.pb(name);
				tid=nid;
			}
			cout<<vname;
			for(string s:v)
				cout<<'.'<<s;
			cout<<endl;
		}
	}
}
signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int T=1;
    //cin>>T;
    while(T--)
    	Solve();
    return 0;
}
2024/10/7 11:24
加载中...