P9754(CSP-S2023C)求调。
查看原帖
P9754(CSP-S2023C)求调。
764746
Sweet_Wrapping_Grass楼主2023/10/24 13:54

总还是要面对这破代码的。

#include<bits/stdc++.h>
using namespace std;
struct Member{
	string TypeName;
	string MemberName;
	int MemberDistance;
	Member(string TypeName,string MemberName,int MemberDistance)
	{
		this->TypeName=TypeName;
		this->MemberName=MemberName;
		this->MemberDistance=MemberDistance;
	}
};
int TypeMemory(string TypeName);
int TypeLimit(string TypeName);
struct Struct{
	string StructName;
	vector<Member> vM;
	int StructMemory;
	int StructLimit;
	Struct(string StructName,int MemberNumber)
	{
		this->StructName=StructName;
		this->StructMemory=0;
		this->StructLimit=0;
		for(int i=1;i<=MemberNumber;i++)
		{
			string TypeName,MemberName;
			cin>>TypeName>>MemberName;
			Member NewMember(TypeName,MemberName,this->StructMemory);
			this->vM.push_back(NewMember);
			int MemberMemory=TypeMemory(TypeName);
			int MemberLimit=TypeLimit(TypeName);
			this->StructMemory+=MemberMemory;
			if(this->StructMemory%MemberLimit)
			this->StructMemory=(this->StructMemory/MemberLimit+1)*MemberLimit;
			this->StructLimit=max(this->StructLimit,MemberLimit);
		}
		if(this->StructMemory%StructLimit)
		this->StructMemory=(this->StructMemory/StructLimit+1)*StructLimit;
	}
};
vector<Struct> vS;
map<string,int> StructNameToId;
map<string,int> ObjectToAddress;
map<int,string> AddressToBasicObject;
int TypeMemory(string TypeName)
{
	if(TypeName=="byte") return 1;else
	if(TypeName=="short") return 2;else
	if(TypeName=="int") return 4;else
	if(TypeName=="long") return 8;else
	return vS[StructNameToId[TypeName]].StructMemory;
}
int TypeLimit(string TypeName)
{
	if(TypeName=="byte") return 1;else
	if(TypeName=="short") return 2;else
	if(TypeName=="int") return 4;else
	if(TypeName=="long") return 8;else
	return vS[StructNameToId[TypeName]].StructLimit;
}
int CurrentAddress=0;
void WorkTheObject(string TypeName,string ObjectName);
struct Object{
	string TypeName;
	string ObjectName;
	int ObjectAddress;
	Object(string TypeName,string ObjectName)
	{
		this->TypeName=TypeName;
		this->ObjectName=ObjectName;
		this->ObjectAddress=CurrentAddress;
		WorkTheObject(TypeName,ObjectName);
	}
};
void WorkTheObject(string TypeName,string ObjectName)
{
	if(TypeName=="byte"||TypeName=="short"||TypeName=="int"||TypeName=="long")
	{
		int MemberMemory=TypeMemory(TypeName);
		int MemberLimit=TypeLimit(TypeName);
		CurrentAddress+=MemberMemory;
		if(CurrentAddress%MemberLimit)
		CurrentAddress=(CurrentAddress/MemberLimit)*MemberLimit;
		ObjectToAddress[ObjectName]=CurrentAddress;
		for(int i=0;i<MemberMemory;i++)
		AddressToBasicObject[CurrentAddress+i]=ObjectName;
		return;
	}
	for(Member _:(vS[StructNameToId[TypeName]].vM))
	{
		ObjectToAddress[ObjectName]=CurrentAddress;
		WorkTheObject(_.TypeName,ObjectName+"."+_.MemberName);
	}
}
int main()
{
	//freopen("struct.in","r",stdin);
	//freopen("struct.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n,op;
	cin>>n;
	while(n--)
	{
		cin>>op;
		if(op==1)
		{
			string s;int k;cin>>s>>k;
			Struct NewStruct(s,k);
			StructNameToId[NewStruct.StructName]=vS.size();
			vS.push_back(NewStruct);
			printf("%lld %lld\n",NewStruct.StructMemory,NewStruct.StructLimit);
		}
		else
		if(op==2)
		{
			string t,n;cin>>t>>n;
			Object NewObject(t,n);
			printf("%lld\n",NewObject.ObjectAddress);
		}
		else
		if(op==3)
		{
			string s;cin>>s;
			printf("%lld\n",ObjectToAddress[s]);
		}
		else
		if(op==4)
		{
			int addr;cin>>addr;
			printf("%s\n",AddressToBasicObject[addr].size()?AddressToBasicObject[addr].c_str():"ERR");
		}
		else assert(false);
	}
	return 0;
}
2023/10/24 13:54
加载中...