0分求调
查看原帖
0分求调
560044
wangyi_c楼主2023/11/4 21:52

非常神秘,手造样例都过了

//mysterious
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,opt,addr,last_addr,k,tot;
string t,n,s;
unordered_map <string,int> beg;
unordered_map <int,string> mp;
unordered_map <string,int> yingshe;
vector <pair<string,string> > v[110];//first->kind second->name
//beg[str] -> the begin ad of str
signed main(){
// 	freopen("struct.in","r",stdin);
// 	freopen("struct.out","w",stdout);	
	cin>>T;
	while(T--){
		cin>>opt;
		if(opt==1){
			int sss=0;
			cin>>s>>k;
			tot++;
			yingshe[s]=tot;
			for(int i=1;i<=k;i++){
				cin>>t>>n;
				v[tot].push_back({t,n});
				if(t=="int") sss=max(sss,4ll);
				if(t=="byte") sss=max(sss,1ll);
				if(t=="long") sss=max(sss,8ll);
				if(t=="short") sss=max(sss,2ll);
			}
			if(last_addr%sss!=0){
				last_addr=(last_addr/sss+1)*sss;
			}
			else last_addr+=sss;
		}
		if(opt==2){
			cin>>t>>n;
			if(t=="int"){
				if(last_addr%4!=0){
					last_addr=(last_addr/4+1)*4;
				}
				for(int i=1;i<=4;i++){
					mp[last_addr+i]=n;
				}
				beg[n]=last_addr;
				last_addr+=4;
			}
			if(t=="byte"){
				if(last_addr%1!=0){
					last_addr=(last_addr/1+1)*1;
				}
				for(int i=1;i<=1;i++){
					mp[last_addr+i]=n;
				}
				beg[n]=last_addr;
				last_addr+=1;
			}
			else if(t=="long"){
				if(last_addr%8!=0){
					last_addr=(last_addr/8+1)*8;	
				}
				for(int i=1;i<=8;i++){
					mp[last_addr+i]=n;
				}
				beg[n]=last_addr;
				last_addr+=8;
			}
			else if(t=="short"){
				if(last_addr%2!=0){
					last_addr=(last_addr/2+1)*2;
				}
				for(int i=1;i<=2;i++){
					mp[last_addr+i]=n;
				}
				beg[n]=last_addr;
				last_addr+=2;
			}
			else{//struct
				for(auto y:v[yingshe[t]]){
					string kindd=y.first;
					string namme=y.second;
					namme=t+"."+namme; 
					if(kindd=="int"){
						if(last_addr%4!=0){
							last_addr=(last_addr/4+1)*4;
						}
						for(int i=1;i<=4;i++){
							mp[last_addr+i]=namme;
						}
						beg[namme]=last_addr;
						last_addr+=4;
					}
					if(kindd=="byte"){
						if(last_addr%1!=0){
							last_addr=(last_addr/1+1)*1;
						}
						for(int i=1;i<=1;i++){
							mp[last_addr+i]=namme;
						}
						beg[namme]=last_addr;
						last_addr+=1;
					}
					else if(kindd=="long"){
						if(last_addr%8!=0){
							last_addr=(last_addr/8+1)*8;	
						}
						for(int i=1;i<=8;i++){
							mp[last_addr+i]=namme;
						}
						beg[namme]=last_addr;
						last_addr+=8;
					}
					else if(kindd=="short"){
						if(last_addr%2!=0){
							last_addr=(last_addr/2+1)*2;
						}
						for(int i=1;i<=2;i++){
							mp[last_addr+i]=namme;
						}
						beg[namme]=last_addr;
						last_addr+=2;
					}
				}
			}
		}
		if(opt==3){
			string got="";
			cin>>s;
			bool f=false;
			int len=s.size();
			for(int i=0;i<len;i++){
				if(f){
					got.push_back(s[i]);
				}
				if(s[i]=='.'){
					f=true;
				}
			}
			if(!f)
				cout<<beg[s]<<"\n";
			else cout<<beg[got]<<"\n";
		}
		if(opt==4){
			cin>>addr;
			if(mp[addr].size()==0){
				cout<<"ERR\n";
			}
			else cout<<mp[addr]<<"\n";
		}
	}
	return 0;
}
2023/11/4 21:52
加载中...