65pts , Re了
查看原帖
65pts , Re了
597555
hzb1121楼主2024/7/16 20:15
#include<bits/stdc++.h>
#define int long long
using namespace std;
int N,v,tail,v1;
struct node{
	string type;
	int begin;
	int end;
	string name;
	int basic;
}a[1000005];
struct Struct{
	string name;
	string t[105];
	string n[105];
}aa[1005];
map<string,int> mp;
map<string,int> dq;
map<string,int> num;
void built(string t,string n,string fa)
{
	v++;
	if(t=="byte"||t=="short"||t=="int"||t=="long"){
		a[v].type=t;
		a[v].name=fa+"."+n;
		a[v].basic=1;
		int len=mp[t];
		if(tail%len!=0)
		{
			tail=tail/len*len+len;
		}
		a[v].begin=tail;
		a[v].end=tail+len-1;
		tail=tail+len;
	}
	else{
		int vvv=v;
		int m;
		a[v].type=t;
		a[v].name=fa+"."+n;
		a[v].basic=0;
		for(int j=1;j<=v1;j++)
		{
			if(aa[j].name==t)
			{
				m=j;
				break;
			}
		}
		int len=mp[t],l=dq[t];
		if(tail%l!=0)
		{
			tail=tail/l*l+l;
		}
		a[v].begin=tail;
		a[v].end=tail+len-1;
		tail=tail;
		for(int j=1;j<=num[t];j++)
		{
			built(aa[m].t[j],aa[m].n[j],a[vvv].name);
		}
	}
}
signed main()
{
	//freopen("P9754_7.in", "r", stdin);
	//freopen("1.out", "w", stdout);
	cin>>N;
	mp["byte"]=1;
	mp["short"]=2;
	mp["int"]=4;
	mp["long"]=8;
	dq["byte"]=1;
	dq["short"]=2;
	dq["int"]=4;
	dq["long"]=8;
	for(int i=1;i<=N;i++)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			v1++;
			string s;
			int k;
			cin>>s>>k;
			aa[v1].name=s;
			int len=0,cnt=0;
			num[s]=k;
			for(int j=1;j<=k;j++)
			{
				cin>>aa[v1].t[j]>>aa[v1].n[j];
				int l=mp[aa[v1].t[j]];
				int ll=dq[aa[v1].t[j]];
				if(len%ll==0) len+=l;
				else len=len/ll*ll+ll+l;
				cnt=max(cnt,ll);
			}
			if(len%cnt!=0) len=len/cnt*cnt+cnt;
			mp[s]=len;
			dq[s]=cnt;
			cout<<len<<" "<<cnt<<endl;
		}
		if(op==2)
		{
			v++;
			string t,n;
			cin>>t>>n;
			if(t=="byte"||t=="short"||t=="int"||t=="long")
			{
				a[v].type=t;
				a[v].name=n;
				a[v].basic=1;
				int len=mp[t];
				if(tail%len!=0)
				{
					tail=tail/len*len+len;
				}
				a[v].begin=tail;
				a[v].end=tail+len-1;
				tail=tail+len;
				cout<<a[v].begin<<endl;
			}
			else{
				int m;
				a[v].type=t;
				a[v].name=n;
				a[v].basic=0;
				for(int j=1;j<=v1;j++)
				{
					if(aa[j].name==t)
					{
						m=j;
						break;
					}
				}
				int len=mp[t],l=dq[t];
				if(tail%l!=0)
				{
					tail=tail/l*l+l;
				}
				a[v].begin=tail;
				a[v].end=tail+len-1;
				tail=tail;
				cout<<a[v].begin<<endl;
				for(int j=1;j<=num[t];j++)
				{
					built(aa[m].t[j],aa[m].n[j],n);
				}
				if(tail%l!=0) tail=tail/l*l+l;
			}
		}
		if(op==3)
		{
			string s;
			cin>>s;
			for(int i=1;i<=v;i++)
			{
				if(a[i].name==s)
				{
					cout<<a[i].begin<<endl;
					break;
				}
			}
		}
		if(op==4)
		{
			int addr,f=1;
			cin>>addr;
			for(int i=1;i<=v;i++)
			{
				if(a[i].basic)
				{
					if(addr>=a[i].begin&&addr<=a[i].end)
					{
						cout<<a[i].name<<endl;
						f=0;
						break;
					}
				}
			}
			if(f==1) cout<<"ERR"<<endl;
		}
	}
	return 0;
}
2024/7/16 20:15
加载中...