样例对了,其他WA,求调!!!
查看原帖
样例对了,其他WA,求调!!!
1177287
Vistamin楼主2024/10/25 18:01
#include<bits/stdc++.h>
using namespace std;


unordered_map<string, int> size_2;
unordered_map<string, int> duiqi;
map<string, int> elemented_addr;//已定义的元素地址 
unordered_map<string, string> elemented_type;//已定义的元素类型 
unordered_map<string, map<string,string>> structure;//1.结构体名  2.成员名  3.成员类型名 
map<string, map<string,int>> pianyi;//1.结构体  2.结构体里的元素   3.相对偏移量 

//for (auto &pair0: pianyi) {
//	for (auto &pair1: pair0) {
//		cout << pair1.seconed << endl;
//	}
//}

int main()
{
//	freopen("in.txt","r",stdin);
	int n;
	cin>>n;
	size_2["byte"] = 1;
	size_2["short"] = 2;
	size_2["int"] = 4;
	size_2["long"] = 8;
	duiqi["byte"] = 1;
	duiqi["short"] = 2;
	duiqi["int"] = 4;
	duiqi["long"] = 8;
	
	for(int i=0;i<n;i++)
	{
		int dotype;
		cin>>dotype;
		if(dotype==1)
		{
			string s;
			cin>>s;
			int k;
			cin>>k;
			int ans=0;
			int flag=0;
			map<string,string> mp;//用于记录structure
			map<string,int> mp_2;//用于记录pianyi 
			for(int j=0;j<k;j++)
			{
				string t,n;
				cin>>t>>n;//n--成员名  t--成员类型名 
				mp[n]=t;
				ans=((ans+duiqi[t]-1)/duiqi[t])*duiqi[t];
				mp_2[n]=ans;
				ans+=size_2[t];
				flag=max(flag, duiqi[t]);//结构体对其要求 	
			}
			ans=((ans+flag-1)/flag)*flag;
			cout<<ans<<" "<<flag<<endl;
			structure[s]=mp;
			pianyi[s] = mp_2;
			size_2[s]=ans;
			duiqi[s]=flag;
		}
		
		int ans_2=0;
		if(dotype==2)
		{
			string t,n;//t元素类型  n元素名称 
			cin>>t>>n;
			elemented_type[n]=t; 
			ans_2=((ans_2+duiqi[t]-1)/duiqi[t])*duiqi[t];//对齐操作 
			cout<<ans_2<<endl;
			elemented_addr[n]=ans_2;
			duiqi[n]=duiqi[t];
			size_2[n]=size_2[t]; 
			ans_2+=size_2[n];
			if(t!="byte" && t!="short" && t!="int" && t!="long")
			{
				structure[n]=structure[t];
			}
		}
		
		if(dotype==3)
		{
			string s;
			cin>>s;
			stringstream ss;
			string last_ss;
			int flag=0;
			if(elemented_type[s]!="byte" && elemented_type[s]!="short" && elemented_type[s]!="int" && elemented_type[s]!="long")
				{
					for(int k=0;k<s.size();k++)
					{
						if(s[k]=='.')
						{
							flag=k;
							break;
						}
						ss << s[k];
					}
					
					last_ss=ss.str();
					ss.str("");
					if(elemented_type[last_ss]!="byte" && elemented_type[last_ss]!="short" && elemented_type[last_ss]!="int" && elemented_type[last_ss]!="long")
					{
						for(int k=flag+1;k<s.size();k++)
						{
							if(s[k]=='.')
							{
								flag=k;
								if(structure[last_ss][ss.str()]!="byte" && structure[last_ss][ss.str()]!="short" && structure[last_ss][ss.str()]!="int" && structure[last_ss][ss.str()]!="long")
								{
									last_ss=structure[last_ss][ss.str()];
									ss.str("");
									continue;
								}
								else
								{
									break;
								}
							}
							ss << s[k];
						}
					}
					cout<<elemented_addr[last_ss]+pianyi[last_ss][ss.str()]<<endl;
				}
				else
				{
					cout<<elemented_addr[s]<<endl;
				}
		}
		if(dotype==4)
		{
			int element;
			cin>>element;
			string elemented_vary;
			int elemented_vary_addr;
			stringstream ss;
			stringstream ss2;
			for(auto pair : elemented_addr)
			{
				if(element < pair.second)
				{
					break;
				}
				elemented_vary = pair.first;
			}
			
			string elemented_struct_vary;
//			cout<<"---------"<<pianyi["x"]["ab"];
			if(elemented_type[elemented_vary]!="type" && elemented_type[elemented_vary]!="short" && elemented_type[elemented_vary]!="int" && elemented_type[elemented_vary]!="long")
			{
						for (auto &pair1: pianyi[elemented_type[elemented_vary]])
						{
							if(element < pair1.second + elemented_addr[elemented_vary])//1.结构体  2.结构体里的元素   3.相对偏移量 
							{
								break;
							}
							elemented_struct_vary = pair1.first;
						}
				cout<<elemented_vary <<"."<<elemented_struct_vary;
			}
		}		
	}
	return 0; 
}



2024/10/25 18:01
加载中...