5分求助,AC#1
查看原帖
5分求助,AC#1
635504
xuyuesen楼主2024/9/29 19:05

代码可读性略差,见谅。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
struct po{//point
	string typ;
	string nam;
	int bh;
	ll start,len,end;//addr
};
struct nd{
	vector<po>v;
	int bh;
	ll siz,len;
}a[205];
struct stru{
	int ndtp;
	int bh;
	ll start,end;//addr
	string nam;	
}f[205];

map<string,nd>mp;//typ
map<string,int>fd;//place

int n,sl,tot;
int op,k;
string s;
string s2,tp;
int addr;
string ans;
po mkpo(string typ,string nam,ll &start){
	po c;
	c.typ=typ;
	c.nam=nam;
	c.bh=mp[typ].bh;
	c.start=ceil(start*1.0/mp[typ].len)*mp[typ].len;
	c.len=mp[typ].len;
	c.end=c.start+c.len-1;
	start=c.end+1;
	return c;
}
nd mknd(string typ,int len,int bh){//basic typ
	nd c;
	c.bh=bh;
	c.len=len;
	c.siz=len;
	return c; 
}
string finds(int adr,int poi){
//	cout<<a[poi].bh<<" ";
	if(adr>a[poi].siz)return "_";
	if(poi<=4)return "";
	int p2,pl;
	for(int i=0;i<a[poi].v.size();i++){
		p2=a[poi].v[i].bh;
		pl=a[poi].v[i].end;
		if(pl<=adr)continue;
		else {
			return '.'+a[poi].v[i].nam+finds(adr-a[poi].v[i].start,p2);
		}
	}
	return "";
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	sl=4;	
	a[1]=mp["byte"]=mknd("byte",1,1);
	a[2]=mp["short"]=mknd("short",2,2);
	a[3]=mp["int"]=mknd("int",4,3);
	a[4]=mp["long"]=mknd("long",8,4);
	cin>>n;
	while(n--){
		cin>>op;
		if(op==1){
			cin>>s>>k;
			sl++;
			a[sl].bh=sl;
			for(int i=1;i<=k;i++){
				cin>>tp>>s2;
				a[sl].v.push_back(mkpo(tp,s2,a[sl].siz));
				a[sl].len=max(a[sl].len,mp[tp].len);
			}
			a[sl].siz=ceil(a[sl].siz*1.0/a[sl].len)*a[sl].len;
			mp[s]=a[sl];
			cout<<a[sl].siz<<" "<<a[sl].len<<"\n";
		}else if(op==2){
			cin>>tp>>s;
			f[++tot].ndtp=mp[tp].bh;
			f[tot].nam=s;
			fd[s]=tot;
			if(tot==1){
				f[tot].start=0;
				f[tot].end=a[f[tot].ndtp].siz-1;
			}else{
				f[tot].start=ceil((f[tot-1].end+1)*1.0/a[f[tot].ndtp].len)*a[f[tot].ndtp].len;
				f[tot].end=f[tot].start+a[f[tot].ndtp].siz-1;
			}
			cout<<f[tot].start<<"\n";
		}else if(op==3){
			cin>>s2;
			s2=s2+'.';
			int l=s2.size();
			s2='-'+s2;			
			ll place=0;
			int poi;
			bool st=1;
			s="";
			for(int i=1;i<=l;i++){
				if(s2[i]=='.'){
					if(st){
						st=0;
						place=f[fd[s]].start;
						poi=f[fd[s]].ndtp;
					}else{
						for(int j=0;j<a[poi].v.size();j++){
							if(a[poi].v[j].nam==s){
								place+=a[poi].v[j].start;
								poi=a[poi].v[j].bh;
								break;
							}
						}
					}
					s="";
				}else{
					s=s+s2[i];
				}
			}
			cout<<place<<"\n";
		}else{
			int poi=-1,p,st;
			cin>>addr;
			for(int i=1;i<=tot;i++){
				p=f[i].start;
				if(addr>=p)poi=i;
				else break;
			}
			if(poi==-1){
				cout<<"ERR\n";
				continue;
			}
			ans="";
			ans=ans+f[poi].nam;
			poi=f[poi].ndtp;
			ans=ans+finds(addr-p,poi);
			int l=ans.size();
			if(ans[l-1]=='_'){
				cout<<"ERR\n";
			}else{
				cout<<ans<<'\n';
			}
		}
	}
	return 0;
}
/*
5
1 a 2
short aa
int ab
1 b 2
a ba
long bb
2 b x
3 x.ba.ab
4 10
*/
2024/9/29 19:05
加载中...