求助,CSP-S T3 RE 70pts
  • 板块学术版
  • 楼主Nangu
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/25 22:23
  • 上次更新2023/10/25 22:24:56
查看原帖
求助,CSP-S T3 RE 70pts
532745
Nangu楼主2023/10/25 22:23
#include <bits/stdc++.h>

#define int long long

using namespace std;

struct node{
	int k, len, maxn;
	string nn;
	vector<string> name, type;
	vector<int> mem, p;
	map<string, int> mem_find;
}a[10000];

struct var{
	int st;
	string type, name;
};

int cnt, now;
vector<var> vv;
map<string, int> mapp, mem, mem_v, maxn, fin;
string in;

inline int calc(int _a, int _b)
{
	return (_a%_b==0?_a/_b:_a/_b+1)*_b;
}

inline string read(int &x)
{
	string res="";
	while(x<in.size() && in[x]!='.') res+=in[x], ++x;
	x++;
//	cout<<endl;
	return res;
}

signed main()
{
//	freopen("struct3.in", "r", stdin);
//	freopen("struct.out", "w", stdout);
	mem["byte"]=1, mem["short"]=2, mem["int"]=4, mem["long"]=8;
	maxn["byte"]=1, maxn["short"]=2, maxn["int"]=4, maxn["long"]=8;
	int T;
	cin>>T;
	while(T--){
		int opt;
		cin>>opt;
		if(opt==1){
			string name;
			int k;
			cin>>name>>k, ++cnt;
			a[cnt].mem.resize(k), a[cnt].name.resize(k), a[cnt].p.resize(k);
			a[cnt].type.resize(k), a[cnt].nn=name, a[cnt].k=k;
			int tmp=0;
			for(int i=0; i<k; i++){
				string type, name;
				cin>>type>>name;
				a[cnt].type[i]=type, a[cnt].name[i]=name;
				a[cnt].mem[i]=mem[type], 
				a[cnt].maxn=max(a[cnt].maxn, maxn[type]);
				tmp=calc(tmp, maxn[type]);
				a[cnt].p[i]=tmp, tmp+=a[cnt].mem[i];
				a[cnt].mem_find[name]=i;
			}
			a[cnt].len=calc(tmp, a[cnt].maxn), 
			mem[a[cnt].nn]=a[cnt].len, maxn[a[cnt].nn]=a[cnt].maxn;
			fin[a[cnt].nn]=cnt;
			cout<<a[cnt].len<<' '<<a[cnt].maxn<<endl;
		}
		if(opt==2){
			string type, name;
			cin>>type>>name;
			now=calc(now, maxn[type]);
			vv.push_back((var){now, type, name});
			cout<<now<<endl;
			now+=mem[type];
		}
		if(opt==3){
			cin>>in;
			int x=0;
			string tmp1=read(x);
			int id=0;
			for(id=0; id<vv.size() && vv[id].name!=tmp1; id++);
//			if(id==vv.size()) return cout<<"ERROR\n", 0;
			int ans=vv[id].st;
//			cout<<id<<"Nangu\n";
			int tmp5=0;
			for(tmp5=1; tmp5<=cnt && a[tmp5].nn!=vv[id].type; tmp5++);
			id=tmp5;
			while(x<in.size()){
				tmp1=read(x);
//				cout<<tmp1<<"***\n";
				int tmp2=a[id].mem_find[tmp1];
//				cout<<tmp2<<"CCF\n";
				ans+=a[id].p[tmp2];
				int tmp4;
				for(tmp4=1; tmp4<=cnt && a[tmp4].nn!=a[id].type[tmp2]; tmp4++);
				if(tmp4==cnt+1) break;
				id=tmp4;
//				cout<<id<<endl;
			}
			cout<<ans<<endl;
		}
		if(opt==4){
			int id;
			int m, l;
			cin>>m, l=0;
			if(m>=now){
				cout<<"ERR\n";
				continue;
			}
			for(id=0; id<vv.size() && vv[id].st<=m; id++);
//			if(id==0) return cout<<"ERROR\n", 0;
			id--, l=vv[id].st;
			if(vv[id].st+mem[vv[id].type]-1<m){
				cout<<"ERR\n";
				continue;
			}
			stringstream ans;
			ans<<vv[id].name;
			id=fin[vv[id].type];
			while(1){
				int i;
				for(i=0; i<a[id].k && a[id].p[i]+l<=m; i++);
				i--, l+=a[id].p[i];
				ans<<"."<<a[id].name[i];
				int tmp2=mem[a[id].type[i]];
				if(tmp2+l<=m) {
					cout<<"ERR\n";
					break;
				}
				if(a[id].type[i]=="int" || a[id].type[i]=="byte" || 
					a[id].type[i]=="short" || a[id].type[i]=="long"){
						cout<<ans.str()<<endl;
						break;
					}
				id=fin[a[id].type[i]];
			}
		}
	}
	return 0;
}
2023/10/25 22:23
加载中...