有人T375pts吗
  • 板块学术版
  • 楼主Kniqht
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/10/24 09:10
  • 上次更新2023/11/2 11:37:35
查看原帖
有人T375pts吗
315205
Kniqht楼主2023/10/24 09:10

rt,15,16,17,19,20 测试点寄了,一点规律没有一头雾水

相信没人想看我的代码,但还是放一下:

思路就是用vector存包含关系,结构体和普通元素都用a数组存储信息。然后我建立一个root节点,将所有定义的元素(结构体或者普通元素)都作为它的子节点。同时如果定义结构体,我就把名字存在vector连的边上

130行无压行极简代码

#include<bits/stdc++.h>
#define ll long long 
#define PII pair<ll,ll>
using namespace std;
const int N=3e6+10;
int m,n;map<string,int> mp,mp1;
ll addr,address,root;
struct dot{
	string name;
	int fir,sec,type;
	//1代表为结构体边
	//0代表非结构体 
};
vector<dot> g[N];
struct Node{
	string name;
	int typ;ll len,max_len;
	ll l,r; 
	//typ 0 1 2 3
}a[N];
string items[4]={"byte","short","int","long"};
int is_item(string str){
	for(int i=0;i<4;i++)
		if(items[i]==str) return i;
	return -1;
}
int ins_num(string name,int typ,int stru_cnt,ll &add){
	int len=(1<<typ);
	a[++n].len=a[n].max_len=len;
	a[n].typ=typ;
	a[n].name=name;
	int md=add%len;
 	a[n].l=(md==0?add:add+len-md);
 	a[n].r=a[n].l+len-1;
 	add=a[n].r+1;
 	a[stru_cnt].max_len=max(a[stru_cnt].max_len,a[n].len);
 	return n;
}
void dfs(string str,int pos,int u,ll sum_align){
	if(pos==str.size()){
		cout<<a[u].l+sum_align<<endl;
		return;
	}
	int i;string now="";
	for(i=pos;str[i]!='.';i++) now+=str[i];
	for(int T=0;T<g[u].size();T++){
		dot j=g[u][T];
		if(j.type&&j.name==now) dfs(str,i+1,j.fir,j.sec+sum_align);
		else if(!j.type&&a[j.fir].name==now) dfs(str,i+1,j.fir,j.sec+sum_align); 
	}
}
bool flag;
void Dfs(int u,int add,ll align,string ans,string now_name,int is_struct){
	if(u!=root) ans+=is_struct?now_name:a[u].name;
	if(!g[u].size()&&a[u].l+align<=add&&a[u].r+align>=add){
		cout<<ans<<endl;flag=1;
		return;
	}
	else if(u!=root) ans+=".";
	for(int T=0;T<g[u].size();T++){
		dot i=g[u][T];
		ll W=i.sec;int ver=i.fir;
		if(a[ver].l+W+align<=add&&a[ver].r+W+align>=add) Dfs(i.fir,add,align+W,ans,i.name,i.type);
	}
}
int main(){
//	freopen("struct.in","r",stdin);
    cin>>m;int op,k;root=-1;
    string str,name,typ;
    while(m--){
    	cin>>op; 
    	if(op==1){
    		cin>>str>>k;addr=0;
    		a[++n].name=str;
    		a[n].typ=-1;int struct_id=n;
    		a[n].l=0;mp[str]=n;
    		while(k--){
    			cin>>typ>>name;
    			int t=is_item(typ);
    			if(t!=-1){
    				ll nowid=ins_num(name,t,struct_id,addr);
    				g[struct_id].push_back({"",nowid,0,0});
				}
				else{
					int inside_struct=mp[typ];
					ll len=a[inside_struct].len;
					ll max_len=a[inside_struct].max_len;
//					cout<<"debug: "<<len<<" "<<max_len<<endl;
					int md=addr%max_len;
					g[struct_id].push_back({name,inside_struct,addr+(!md?0:max_len-md),1});
					a[struct_id].max_len=max(a[struct_id].max_len,max_len);
					addr+=(!md?0:max_len-md)+len;
//					cout<<addr<<endl;
				}
			}
			ll len=a[struct_id].max_len;
			int md=addr%len;
			addr+=(!md?0:len-md);
			a[struct_id].r=addr;
			a[struct_id].len=addr;
			printf("%lld %lld\n",addr,a[struct_id].max_len);
		}
		else if(op==2){
			cin>>typ>>name;
			if(!(~root)) root=++n;
			int t=is_item(typ);
			if(~t){
				int nowid=ins_num(name,t,root,address);
    			g[root].push_back({"",nowid,0,0});
    			printf("%lld\n",a[nowid].l);
			}
			else{
				int inside_struct=mp[typ];
				ll len=a[inside_struct].max_len,Len=a[inside_struct].len;
				int md=address%len;ll now_align=(!md?0:len-md);
//				cout<<"debug: "<<len<<" "<<md;
 				a[root].max_len=max(a[root].max_len,len);
				g[root].push_back({name,inside_struct,address+now_align,1});
				printf("%lld\n",address+now_align);
				address+=now_align+Len;
//				cout<<"debug: "<<now_align<<" "<<address<<endl;
			}
		} 
		else if(op==3){
			cin>>name;name+=".";
			dfs(name,0,root,0);
		}
		else{
			cin>>k;flag=0;
			Dfs(root,k,0,"","",0);
			if(!flag) printf("ERR\n");
		}
	}
	return 0;
}
2023/10/24 09:10
加载中...