5pts求调
查看原帖
5pts求调
750862
yxyaiunn楼主2024/10/14 19:57
#include <iostream>
#include <queue>
#include <map>
using namespace std;
long long addr_start=0;
long long num[10005][2];
int maxn=0;
string finds[10005];
map<string,pair<long long,long long> > m;
map<string,int>limit;
map<string,string> structt[10005],structt2[10005];
map<string,int> findd; 
map<string,int> find_small;
map<string,int> where1,where2;
queue<string> q,q2;
bool check(string sss){
	if(sss=="byte"||sss=="short"||sss=="int"||sss=="long"){
		return false;
	}
	return true;
}
void solve_before1(string tt,string nn,string ss,int &ans1,int &ans2){
	int lenn=findd[tt];
	int large=0;
	int require=0;
	int last=0;
	for(int i=1;i<=lenn;i++){
		require=max(require,where2[structt[i][tt]]);
	}
	for(int i=1;i<=lenn;i++){
		if(check(structt[i][tt])){
			int lar=last+large;
			last=where1[structt[i][tt]];
			require=max(require,where2[structt[i][tt]]);
			int len=require;
			int large2=lar/len*len;
			if(large2!=lar){
				lar=large2+len;
			}
			large=lar;
		}else{
			int len=last+large;
			last=limit[structt[i][tt]];
			require=max(require,limit[structt[i][tt]]);
			int lim=require;
			int len2=len/lim*lim;
			if(len2!=len){
				len=len2+lim;
			}
			large=len;
		}
	}
	ans1=large;
	ans2=require;
	limit[ss]=max(limit[ss],require);
}
void solve1(string tt,string nn,string ss,int numm,int &ans1,int &ans2){
	int large=0;
	int lim=0;
	if(check(tt)){
		int ans1,ans2;
		solve_before1(tt,nn,ss,ans1,ans2);
		large=ans1;
		lim=ans2;
	}else{
		large=limit[tt];
		lim=limit[tt];
		limit[ss]=max(limit[ss],limit[tt]);
	}
	structt[numm][ss]=tt;
	structt2[numm][ss]=nn;
	findd[ss]++;
	ans1=large;
	ans2=lim;
	int ans11=ans1/ans2*ans2;
	if(ans11!=ans1){
		ans1=ans11+ans2;
	}
	where1[ss]+=ans1;
	where2[ss]+=ans2;
}
void solve_before2(string tt,string nn){
	if(!check(tt)){
		maxn++;
		int lim=limit[tt];
		long long len=lim+addr_start-1;
		finds[maxn]=nn;
		num[maxn][0]=addr_start;
		long long len2=len/lim*lim;
		if(len2!=len){
			len=len2+lim;
		}
		m[nn]=make_pair(addr_start,len);
		addr_start=len;
		num[maxn][1]=addr_start-1;	
		return;
	}else{
		q.push(nn);
		long long addr2=addr_start+limit[tt]-1;
		int limmit=0;
		int last2=0;
		for(int i=1;i<=findd[tt];i++){
			maxn++;
			limmit=max(limmit,where2[structt[i][tt]]);
			long long name=last2+addr_start-1;
			last2=where1[structt[i][tt]];
			if(check(structt[i][tt])){
				maxn--;
				solve_before2(structt[i][tt],structt2[i][tt]);
				while(!q.empty()){
					q2.push(q.front());
					q.pop();
				}
				while(!q2.empty()){
					if(q2.size()>1){
						q.push(q2.front());
					}
					q2.pop();
				}
			}else{
				finds[maxn]="";
				q.push(structt2[i][tt]);
				while(!q.empty()){
					q2.push(q.front());
					finds[maxn]+=q.front();
					if(q.size()!=1){
						finds[maxn]+=".";
					}
					q.pop();
				}
				while(!q2.empty()&&q2.size()>1){
					q.push(q2.front());
					q2.pop();
				}
				find_small[finds[maxn]]=addr_start;
				num[maxn][0]=addr_start;
				name+=where1[structt[i][tt]];
				num[maxn][1]=name;
				if(i!=findd[tt]){
					long long name2=name/where2[structt[i+1][tt]]*where2[structt[i+1][tt]];
					if(name2!=name){
						name=name2+where2[structt[i][tt]];
					}
				}
				m[nn]=make_pair(addr_start,name);
				addr_start=name;
			}
		}
		return;
	}
}
void solve2(string tt,string nn){
	long long addr2=addr_start/limit[tt]*limit[tt];
	if(addr2!=addr_start){
		addr_start=addr2+limit[tt];
	}
	if(!check(tt)){
		maxn++;
		int lim=limit[tt];
		long long len=limit[tt]+addr_start-1;
		finds[maxn]=nn;
		num[maxn][0]=addr_start;
		find_small[nn]=addr_start;
		long long len2=len/lim*lim;
		if(len2!=len){
			len=len2+lim;
		}
		m[nn]=make_pair(addr_start,len);
		cout<<addr_start<<endl;
		addr_start=len;
		num[maxn][1]=addr_start-1;	
	}else{
		cout<<addr_start<<endl;
		long long addr2;
		int limmit=0;
		int last=0;
		for(int i=1;i<=findd[tt];i++){
			maxn++;
			limmit=max(limmit,where2[structt[i][tt]]);
			long long name=last+addr_start-1;
			last=where1[structt[i][tt]];
			if(check(structt[i][tt])){
				maxn--;
				q.push(nn);
				solve_before2(structt[i][tt],structt2[i][tt]);
				q.pop();
			}else{
				finds[maxn]=nn+"."+structt2[i][tt];
				find_small[finds[maxn]]=addr_start;
				num[maxn][0]=addr_start;
				name+=where1[structt[i][tt]];
				num[maxn][1]=name;
				if(i!=findd[tt]){
					long long name2=name/where2[structt[i+1][tt]]*where2[structt[i+1][tt]];
					if(name2!=name){
						name=name2+where2[structt[i][tt]];
					}
				}
				m[nn]=make_pair(addr_start,name);
				addr_start=name;
			}
		}
	}
}
void solve3(string str){
	cout<<find_small[str]<<endl;
}
void solve4(long long ad){
	int l=1,r=maxn;
	int flag=0;
	while(l<=r){
		int mid=l+r>>1;
		if(num[mid][0]<=ad&&ad<=num[mid][1]){
			cout<<finds[mid]<<endl;
			flag=1;
			break;
		}else if(ad>num[mid][1]){
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	if(flag==0&&!(num[l+r>>1][0]<=ad&&ad<=num[l+r>>1][1])){
		cout<<"ERR\n";
	}
}
signed main(){
	int n;
	cin>>n;
	where1["byte"]=where2["byte"]=limit["byte"]=1;
	where1["short"]=where2["short"]=limit["short"]=2;
	where1["int"]=where2["int"]=limit["int"]=4;
	where1["long"]=where2["long"]=limit["long"]=8;
	for(int ii=1;ii<=n;ii++){
		int op;
		cin>>op;
		if(op==1){
			string s;
			int k;
			cin>>s>>k;
			int ans1=0,ans2=0,last=0;
			for(int i=1;i<=k;i++){
				string t,n;
				cin>>t>>n;
				int try1,try2;
				ans1+=last;
				solve1(t,n,s,i,try1,try2);
				last=try1-1;
				ans2=max(ans2,try2);
				int ans11=ans1/try2*try2;
				if(ans11!=ans1){
					ans1=ans11+try2;
				}
			}
			ans1+=last;
			int ans11=ans1/ans2*ans2;
			if(ans11!=ans1){
				ans1=ans11+ans2;
			}
			cout<<ans1<<" "<<ans2<<endl;
		}else if(op==2){
			string t,n;
			cin>>t>>n;
			solve2(t,n);
		}else if(op==3){
			string s;
			cin>>s;
			solve3(s);
		}else{
			long long addr;
			cin>>addr;
			solve4(addr);
		}
	}
	return 0;
} 
2024/10/14 19:57
加载中...