【【玄关!】】求调!5pts RE+WA+AC
查看原帖
【【玄关!】】求调!5pts RE+WA+AC
743014
_H17_楼主2024/8/29 22:39
#include<bits/stdc++.h>
#define int long long 
using namespace std;
constexpr int N=101;
int n,op,k,new_place;
string s;
struct Type{
    string name;
    int size,memory;//size大小 memory对齐
    vector<tuple<string,string,int> >vec;
    map<string,int>var_id;
    void init(){
        for(int i=0;i<vec.size();i++)
            var_id[get<1>(vec[i])]=i;
    	return;
	}
};
vector<tuple<string,string,int> >vec;
vector<Type>structure;
map<string,int>struct_id,var_id;
vector<tuple<string,string,int> >global;
string get_first(string&s){
	int len=s.find('.');
	if(len==s.npos){
		string t=s;
		s="";
		return t;
	}
	string first=s.substr(0,len);
	s=s.substr(len+1,s.size()-len-1);
	return first;
}
int find(tuple<string,string,int>var,string cmd,int add){
//	cerr<<get<0>(var)<<' '<<get<1>(var)<<' '<<get<2>(var)<<' '<<cmd<<'\n';
	Type&type=structure[struct_id[get<0>(var)]];
	string first=get_first(cmd),tmp;
	assert(type.var_id[first]<type.vec.size());
	tuple<string,string,int>variable=type.vec[type.var_id[first]];
	add+=get<2>(var);
    //exit(1);
	tmp=get<0>(variable);
	if(tmp=="byte"||tmp=="short"||tmp=="int"||tmp=="long")
		return add+get<2>(variable);
	return find(variable,cmd,add);
}
string get_var(tuple<string,string,int>var,int addr){
//	cerr<<get<0>(var)<<' '<<get<1>(var)<<' '<<get<2>(var)<<' '<<addr<<'\n';
	string ret=get<1>(var);
	string type_name=get<0>(var);
	if(type_name=="byte"||type_name=="short"||type_name=="int"||type_name=="long"){
		if(addr<structure[struct_id[type_name]].size)
			return ret;
		else
			return"ERR";
	}
	Type&type=structure[struct_id[type_name]];
	int l=0,r=type.vec.size()-1,mid;
	if(l>r)
		return"ERR";
	while(l<r){
		mid=(l+r+1)>>1;
		if(get<2>(type.vec[mid])>addr)
			r=mid-1;
		else
			l=mid;
	}
	string new_var=get_var(type.vec[l],addr-get<2>(type.vec[l]));
	if(new_var=="ERR")
		return"ERR";
	else
		return ret+(string)"."+new_var;
}
signed main(){
    Type type;
    type.size=type.memory=1;
    type.name="byte";
    structure.push_back(type),struct_id[type.name]=0;
    type.size=type.memory=2;
    type.name="short";
    structure.push_back(type),struct_id[type.name]=1;
    type.size=type.memory=4;
    type.name="int";
    structure.push_back(type),struct_id[type.name]=2;
    type.size=type.memory=8;
    type.name="long";
    structure.push_back(type),struct_id[type.name]=3;
    for(cin>>n;n;--n){
        cin>>op;
        if(op==1){
            cin>>s>>k;
            int mem=0,siz=0;
            string typ,nam;
            vec.resize(k);
            for(int i=0;i<k;i++){
                cin>>typ>>nam;
                Type&type=structure[struct_id[typ]];
                mem=max(mem,type.memory);
                if(siz%type.memory)
                    siz=(siz/type.memory+1)*type.memory;
                vec[i]=make_tuple(typ,nam,siz);
                siz+=type.size;
            }
            Type newtype;
            newtype.name=s,newtype.memory=mem,newtype.size=siz;
            newtype.vec=vec;
            newtype.init();
            structure.push_back(newtype);
            struct_id[s]=structure.size()-1;
            cout<<siz<<' '<<mem<<'\n';
        }
        if(op==2){
        	string typ,nam;
        	cin>>typ>>nam;
        	Type&type=structure[struct_id[typ]];
        	if(new_place%type.memory)
        		new_place=(new_place/type.memory+1)*type.memory;
        	global.push_back(make_tuple(typ,nam,new_place));
        	cout<<new_place<<'\n';
        	new_place+=type.size;
        	var_id[nam]=global.size()-1;
		}
		if(op==3){
			string cmd,first;
			cin>>cmd;
			first=get_first(cmd);
			cout<<find(global[var_id[first]],cmd,0)<<'\n';
		}
		if(op==4){
			int addr,l=0,r=global.size()-1,mid;
			cin>>addr;
			if(l>r){
				cout<<"ERR\n";
				continue;
			}
			while(l<r){
				mid=(l+r+1)>>1;
				if(get<2>(global[mid])>addr)
					r=mid-1;
				else
					l=mid;
			}
			cout<<get_var(global[l],addr-get<2>(global[l]))<<'\n';
		}
    }
    return 0;
}

使用结构体 Type 存储题目中的结构体,用 tuple 存储变量(type,name,place 的方式)

这里 place 指的是在当前结构体(全局)中的内存

比如 struct1 a其中 a 的内存是 2 ,a.b 的内存是 2+b的内存

2024/8/29 22:39
加载中...