只A了前三个点,#4到#13WA,#14到#20RE
疑似操作2出问题,可能无限递归了
#include<bits/stdc++.h>
#define N 100010
#define int long long
using namespace std;
struct zyx{//这个元素类型是t,元素名是n
string t,n;
};
struct node{
int l,r;
};
vector<zyx> str[11000];
int bj,n,cnt,now,ans;
bool flag;
map<string,int> m,sz,dx;//m:名字为string的结构体编号为int,sz:大小,dx:对齐标准
map<string,node> ad;//名字对应地址
string temp[11000];//地址对应名字
void solve(string t,string n){//处理基本变量 byte,short,int,long
temp[++cnt]=n;
// cout<<"标记"<<n<<'\n';
// cout<<now<<'\n';
if(t=="byte"){
if(flag==0)ans=now,flag=1;
ad[n].l=ad[n].r=now;now++;
}
else if(t=="short"){
if(now%2==1)now++;
if(flag==0)ans=now,flag=1;
ad[n].l=now,now+=2;
ad[n].r=now-1;
}
else if(t=="int"){
while(now%4!=0)now++;
if(flag==0)ans=now,flag=1;
ad[n].l=now,now+=4;
ad[n].r=now-1;
}
else if(t=="long"){
while(now%8!=0)now++;
if(flag==0)ans=now,flag=1;
ad[n].l=now,now+=8;
ad[n].r=now-1;
}
return;
}
void op1(){
string s;
int k;
cin>>s>>k;
cnt++;
m[s]=cnt;
int maxn=1,nnow=0;
for(int i=1;i<=k;i++){
string t,n;
cin>>t>>n;
if(m[t]){
nnow+=sz[t];
while(nnow%dx[t]!=0)nnow++;
maxn=max(maxn,dx[t]);
}
else{
if(t=="byte")nnow++;
else if(t=="short"){
if(nnow%2==1)nnow++;
nnow+=2;
maxn=max(maxn,(int)2);
}
else if(t=="int"){
while(nnow%4!=0)nnow++;
nnow+=4;
maxn=max(maxn,(int)4);
}
else if(t=="long"){
while(nnow%8!=0)nnow++;
nnow+=8;
maxn=max(maxn,(int)8);
}
}
str[cnt].push_back((zyx){t,n});
}
while(nnow%maxn!=0)nnow++;
cout<<nnow<<" "<<maxn<<'\n';
sz[s]=nnow,dx[s]=maxn;
}
void s(string t,string n){
if(m[t]){//递归处理结构体
// cout<<"找到结构体 "<<t<<'\n';
while(now%dx[t]!=0)now++;
// cout<<now<<'\n';
int num=m[t];
for(int i=0;i<str[num].size();i++){
// cout<<"开始操作"<<str[num][i].t<<","<<n+"."+str[num][i].n<<'\n';
s(str[num][i].t,n+"."+str[num][i].n);
}
while(now%dx[t]!=0)now++;
}
else if(!m[t]){
// cout<<"不是哥们\n";
solve(t,n);
}
}
void op2(){
bj=1;
string t,n;
cin>>t>>n;
flag=0;
s(t,n);
cout<<ans<<'\n';
}
void op3(){
string s;
cin>>s;
cout<<ad[s].l<<'\n';
}
void op4(){
int addr;
cin>>addr;
if(bj==0){
cout<<"ERR\n";
return;
}
for(int i=1;i<=cnt;i++){
if(ad[temp[i]].l<=addr&&ad[temp[i]].r>=addr){
cout<<temp[i]<<'\n';
return;
}
}
cout<<"ERR\n";
}
signed main(){
// freopen("struct3.in","r",stdin);
// freopen("struct.out","w",stdout);
cin>>n;
while(n--){
int op;
scanf("%lld",&op);
if(op==1)op1();
else if(op==2)op2();
else if(op==3)op3();
else if(op==4)op4();
}
return 0;
}