15pts求调,悬三关,有注释
查看原帖
15pts求调,悬三关,有注释
654577
RainySoul楼主2024/7/26 15:27

只A了前三个点,#4到#13WA,#14到#20RE

疑似操作2出问题,可能无限递归了

#include<bits/stdc++.h>
#define N 100010
#define int long long
using namespace std;
struct zyx{//这个元素类型是t,元素名是n 
	string t,n;
};
struct node{
	int l,r;
}; 
vector<zyx> str[11000]; 
int bj,n,cnt,now,ans;
bool flag;
map<string,int> m,sz,dx;//m:名字为string的结构体编号为int,sz:大小,dx:对齐标准 
map<string,node> ad;//名字对应地址 
string temp[11000];//地址对应名字 
void solve(string t,string n){//处理基本变量 byte,short,int,long 
	temp[++cnt]=n;
//	cout<<"标记"<<n<<'\n';
//	cout<<now<<'\n';
	if(t=="byte"){
		if(flag==0)ans=now,flag=1;
		ad[n].l=ad[n].r=now;now++;
	}
	else if(t=="short"){
		if(now%2==1)now++;
		if(flag==0)ans=now,flag=1;
		ad[n].l=now,now+=2;
		ad[n].r=now-1;
	}
	else if(t=="int"){
		while(now%4!=0)now++;
		if(flag==0)ans=now,flag=1;
		ad[n].l=now,now+=4;
		ad[n].r=now-1;
	}
	else if(t=="long"){
		while(now%8!=0)now++;
		if(flag==0)ans=now,flag=1;
		ad[n].l=now,now+=8;
		ad[n].r=now-1;
	}
	return;
}
void op1(){
	string s;
	int k;
	cin>>s>>k;
	cnt++;
	m[s]=cnt;
	int maxn=1,nnow=0;
	for(int i=1;i<=k;i++){
		string t,n;
		cin>>t>>n;
		if(m[t]){
			nnow+=sz[t];
			while(nnow%dx[t]!=0)nnow++;
			maxn=max(maxn,dx[t]);
		}
		else{
			if(t=="byte")nnow++;
			else if(t=="short"){
				if(nnow%2==1)nnow++;
				nnow+=2;
				maxn=max(maxn,(int)2);
			}
			else if(t=="int"){
				while(nnow%4!=0)nnow++;
				nnow+=4;
				maxn=max(maxn,(int)4);
			}
			else if(t=="long"){
				while(nnow%8!=0)nnow++;
				nnow+=8;
				maxn=max(maxn,(int)8);
			}
		}
		str[cnt].push_back((zyx){t,n});
	}
	while(nnow%maxn!=0)nnow++;
	cout<<nnow<<" "<<maxn<<'\n';
	sz[s]=nnow,dx[s]=maxn;
}
void s(string t,string n){
	if(m[t]){//递归处理结构体 
//		cout<<"找到结构体 "<<t<<'\n';
		while(now%dx[t]!=0)now++;
//		cout<<now<<'\n';
		int num=m[t];
		for(int i=0;i<str[num].size();i++){
//			cout<<"开始操作"<<str[num][i].t<<","<<n+"."+str[num][i].n<<'\n';
			s(str[num][i].t,n+"."+str[num][i].n);
		}
		while(now%dx[t]!=0)now++;
		
	}
	else if(!m[t]){
//		cout<<"不是哥们\n";
		solve(t,n);
	}
}
void op2(){
	bj=1;
	string t,n;
	cin>>t>>n;
	flag=0; 
	s(t,n);
	cout<<ans<<'\n';
}
void op3(){
	string s;
	cin>>s;
	cout<<ad[s].l<<'\n';
}
void op4(){
	int addr;
	cin>>addr;
	if(bj==0){
		cout<<"ERR\n";
		return;
	}
	for(int i=1;i<=cnt;i++){
		if(ad[temp[i]].l<=addr&&ad[temp[i]].r>=addr){
			cout<<temp[i]<<'\n';
			return;
		}
	}
	cout<<"ERR\n";
}
signed main(){
//	freopen("struct3.in","r",stdin);
//	freopen("struct.out","w",stdout);
	cin>>n;
	while(n--){
		int op;
		scanf("%lld",&op);
		if(op==1)op1(); 
		else if(op==2)op2();
		else if(op==3)op3();
		else if(op==4)op4();
	}
	return 0;
}
2024/7/26 15:27
加载中...