求助 样例3(struct3.in) 没过
查看原帖
求助 样例3(struct3.in) 没过
246331
mystic_qwq楼主2024/5/13 20:20
#include<bits/stdc++.h>
using namespace std;
#define int long long
using pis=pair<int,string>;
using ll=long long;
#define fi first
#define se second
#define pb push_back
#define all(x) x.begin(),x.end()
const int N=2001;
string name[N]; int cnt;
vector<pis>ele[N];
int siz[N],base[N];
pis var[N]; int tot;
int pos[N];
int find1(string n){
  //printf("find1: %s\n",n.c_str());
  for(int i=1;i<=tot;++i) {
    //printf("var_%d.se=%s\n",i,var[i].se.c_str());
    if(var[i].se==n) return i; 
  }
  return 0;
}
pis find2(int type,string s,int&ps){
  //printf("find2:typ:%d str:%s posbg:%d\n",type,s.c_str(),ps);
  //int bas=base[type]; 
  for(auto[x,s1]:ele[type]){
    //if((ps+=siz[x])%bas) ps=(ps/bas+1)*bas;
    //printf("Enter[%d,%s]\n",x,s1.c_str());
    if(s1==s) {
      if(ps%base[x]) ps=base[x]*(ps/base[x]+1);
      //printf("found: ps %d\n",ps);
      return {x,s1};
    }
    if((ps+=siz[x])%base[x]) ps=(ps/base[x]+1)*base[x];
    //if((ps+=siz[x])%bas) ps=(ps/bas+1)*bas;
    //printf("ps changes to %d\n",ps);
  }
  return {-1,""};
}
string str(string x,int l,int r){ //[l,r)
  string res;
  for(int i=l;i<r;++i) res+=x[i];
  return res;
}
string dfs(int,int,const int);
main(){
  cin.tie(0)->sync_with_stdio(0);
  name[1]="byte",name[2]="short",name[3]="int",name[4]="long";
  siz[1]=1,siz[2]=2,siz[3]=4,siz[4]=8;
  base[1]=1,base[2]=2,base[3]=4,base[4]=8; cnt=4;
  int n; cin>>n;
  for(int op;n--;){
    cin>>op;
    if(op==1){
      string s; int k; 
      cin>>s>>k; name[++cnt]=s;
      for(string s1,s2;k--;){
        cin>>s1>>s2;
        int ps=find(name+1,name+cnt+1,s1)-name;
        ele[cnt].pb({ps,s2});
        //printf("elements: %s %s\n",name[ps].c_str(),s2.c_str());
      }
      /*int mx=siz[max_element(all(ele[cnt]),
      [&](pis a,pis b){
        return siz[a.fi]<siz[b.fi];
      })],sz=0; */
      int mx=0,sz=0;
      for(auto[x,ss]:ele[cnt])
        if(base[x]>base[mx]) mx=x;
      mx=base[mx];
      //printf("base is %d\n",mx);
      for(auto[x,ss]:ele[cnt])
        if((sz+=siz[x])%base[x]) sz=(sz/base[x]+1)*base[x];
      if(sz%mx) sz=(sz/mx+1)*mx;
      siz[cnt]=sz,base[cnt]=mx;
      cout<<sz<<' '<<mx<<'\n';
    }
    if(op==2){
      string t,n; cin>>t>>n;
      int ps=find(name+1,name+cnt+1,t)-name;
      pos[tot+1]=pos[tot]+siz[ps];
      int bas=base[ps];
      if(pos[tot]%bas)
        pos[tot+1]=(pos[tot+1]/bas+1)*bas;
      //printf("pos_%d=%d\n",tot+1,pos[tot+1]);
      cout<<pos[tot++]<<'\n';
      var[tot]={ps,n};
      //printf("var_%d={%s,%s}\n",tot,name[ps].c_str(),n.c_str());
    }
    if(op==3){
      string s; cin>>s; int l=0,len=s.size();
      for(;l<len&&s[l]^'.';++l);
      //printf("First dot(%d): %s\n",l,str(s,0,l).c_str());
      if(l==len) {cout<<pos[find1(str(s,0,l))-1]<<'\n';continue;}
      int ps=find1(str(s,0,l)),pp=pos[ps-1],T=var[ps].fi;
      //printf("Sep: ps(%d)'s name is %s\n     type on T=%d is %s\n",ps,var[ps].se.c_str(),T,name[T].c_str());
      ++l;
      for(int l1;;l=l1+1){
        for(l1=l;l1<len&&s[l1]^'.';++l1);
        //pis varp=find2(T,s.substr(l,l1-l),pp);
        //printf("l1=%d l=%d sub=%s\n",l1,l,str(s,l,l1).c_str());
        pis varp=find2(T,str(s,l,l1),pp);
        //printf("pos=%d | (%d) %s\n",pp,l1,str(s,l,l1).c_str());
        if(l1==len) {cout<<pp<<'\n'; break;}
        T=varp.fi;  //printf("T changes to %d\n",T);
      }
    }
    if(op==4){
      int addr,ps=1; cin>>addr;   
      if(addr>=pos[tot]){ cout<<"ERR\n"; continue;}
      //for(int i=1;i<=tot;++i) cout<<pos[i]<<" \n"[i==tot];
      for(;ps<=tot;++ps)
        if(addr>=pos[ps-1]&&addr<pos[ps]) break;
      int ps1=pos[ps-1],typ=var[ps].fi;//,ad=-1,mx=base[typ];
      //printf("var number:%d BigType(%d)=%s\n",ps,typ,name[typ].c_str());
      if(typ<=4) {cout<<var[ps].se<<'\n'; continue;}
      string res=dfs(ps1,typ,addr);
      if(res=="ERR\n"){ cout<<res; continue;}
      cout<<var[ps].se+'.'+dfs(ps1,typ,addr)<<'\n';
      /*if(addr==pos[ps-1]){
        if(typ<=4) cout<<var[ps].se<<'\n';
        else cout<<"ERR\n"; continue;
      }
      for(auto[x,s1]:ele[typ]){
        if((ps1+=siz[x])%base[x]) ps1=base[x]*(ps1/base[x]+1);
        if(addr<ps1) {
          if(x<=4) cout<<var[ps].se<<'.'<<s1<<'\n';
          else cout<<"ERR\n"; goto _;
        }
      }*/
    }
    _:;
  }
}
const string fail="ERR\n";
string dfs(int ps,int T,const int addr){
  //printf("pos:%d, typ=%d(tynam=%s) (addr=%d)\n",ps,T,name[T].c_str(),addr);
  int bgp=ps;
  for(int i=0;i<ele[T].size();++i){
    auto[x,s1]=ele[T][i];
    ps+=siz[x];
    if(ps<=addr){
      if(ps%base[x]) 
        if((ps=base[x]*(ps/base[x]+1))>addr) return"ERR\n";
    } else {
      if(x<=4) return s1;
      string res=dfs(ps-siz[x],x,addr);
      if(res==fail) return res;
      return s1+'.'+res;
    }
  }
  return"ERR\n";
}

2024/5/13 20:20
加载中...