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;
}