神秘 85 pts WA on #16 #17 #19 求调 悬关
查看原帖
神秘 85 pts WA on #16 #17 #19 求调 悬关
718487
CleverRaccoonʕ•ᴥ•ʔ楼主2024/8/28 11:00

提交记录

#include <bits/stdc++.h>
using namespace std;

#define int long long

struct Value{
	string type,name;
};

int n;
long long pos=-1,lsSize;
string ans="";
unordered_map<string,long long> valCnt;
unordered_map<string,long long> alignStd;
unordered_map<string,long long> typeSize;
unordered_map<string,vector<Value>> strVal;
unordered_map<string,unordered_map<string,long long>> addPos;
unordered_map<string,long long> startPos;
unordered_map<string,string> typeOf;

void init(){
	typeSize["byte"]=alignStd["byte"]=1;
	typeSize["short"]=alignStd["short"]=2;
	typeSize["int"]=alignStd["int"]=4;
	typeSize["long"]=alignStd["long"]=8;
}

void newStruct(){
	string strName;
	int kCnt;
	cin>>strName>>kCnt;
	valCnt[strName]=kCnt;
	for(int i=1;i<=kCnt;i++){
		string type,name;
		cin>>type>>name;
		alignStd[strName]=max(alignStd[strName],alignStd[type]);
		strVal[strName].push_back({type,name});
	}
	addPos[strName][strVal[strName][0].name]=0;
	typeOf[strName+"."+strVal[strName][0].name]=strVal[strName][0].type;
	long long o=0,s=typeSize[strVal[strName][0].type];
	for(int i=1;i<kCnt;i++){
		string type=strVal[strName][i].type;
		string name=strVal[strName][i].name;
		long long a=alignStd[type];
		o=ceil(1.0*(o+s)/a)*a;
		addPos[strName][name]=o;
		s=typeSize[type];
		typeOf[strName+"."+name]=type;
	}
	typeSize[strName]=ceil(1.0*(o+s)/alignStd[strName])*alignStd[strName];
	cout<<typeSize[strName]<<' '<<alignStd[strName]<<'\n';
}

void newValue(){
	string type,name;
	cin>>type>>name;
	if(pos==-1){
		pos=0;
	}else{
		pos=ceil(1.0*(pos+lsSize)/alignStd[type])*alignStd[type];
	}
	lsSize=typeSize[type];
	startPos[name]=pos;
	typeOf[name]=type;
	cout<<startPos[name]<<'\n';
}

long long dfs1(vector<string>&vs,int id){
	if(id==vs.size()-1){
		return addPos[typeOf[typeOf[vs[id-2]]+"."+vs[id-1]]][vs[id]];
	}
	if(id==1){
		return addPos[typeOf[vs[id-1]]][vs[id]]+dfs1(vs,id+1);
	}
	return addPos[typeOf[typeOf[vs[id-2]]+"."+vs[id-1]]][vs[id]]+dfs1(vs,id+1);
}

void getAddr(){
	string val;
	cin>>val;
	vector<string> vs;
	string tmp;
	for(int i=0;i<val.size();i++){
		if(val[i]=='.'){
			vs.push_back(tmp);
			tmp="";
		}else{
			tmp+=val[i];
		}
	}
	vs.push_back(tmp);
	if(vs.size()==1){
		cout<<startPos[vs[0]]<<'\n';
	}else if(vs.size()==2){
		cout<<startPos[vs[0]]+addPos[typeOf[vs[0]]][vs[1]]<<'\n';
	}else{
		cout<<startPos[vs[0]]+dfs1(vs,1)<<'\n';
	}
}

void dfs2(string before,string name,long long addr,long long st){
	string type=before==""?typeOf[name]:typeOf[before+"."+name];
	if(type=="byte"||type=="short"||type=="int"||type=="long"){
		return;
	}
	long long start=before==""?startPos[name]:st+addPos[before][name];
	bool none=true;
	for(int i=0;i<strVal[type].size();i++){
		string cType=strVal[type][i].type;
		string cName=strVal[type][i].name;
		long long addP=addPos[type][cName];
		long long size=typeSize[cType];
		if(start+addP<=addr&&addr<start+addP+size){
			ans+="."+cName;
			none=false;
			dfs2(type,cName,addr,start);
			break;
		}
	}
	if(none){
		ans="ERR";
	}
}

void getValue(){
	long long addr;
	cin>>addr;
	string bName;
	bool none=true;
	for(auto &p:startPos){
		string name=p.first;
		string type=typeOf[name];
		long long size=typeSize[type];
		long long pos=p.second;
		if(pos<=addr&&addr<pos+size){
			bName=name;
			none=false;
			break;
		}
	}
	if(none){
		cout<<"ERR\n";
		return;
	}
	ans=bName;
	dfs2("",bName,addr,0);
	cout<<ans<<'\n';
}

signed main(){
	cin.tie(nullptr)->sync_with_stdio(false);
	init();
	cin>>n;
	for(int i=1,op;i<=n;i++){
		cin>>op;
		if(op==1){
			newStruct();
		}else if(op==2){
			newValue();
		}else if(op==3){
			getAddr();
		}else{
			getValue();
		}
	}
	return !~(0^0);
}
2024/8/28 11:00
加载中...