MnZn 求助 S 组 T3

学术版

diqiuyi @ 2023-10-22 12:50:47

rt,全 RE,赛时一直没调出来

#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
    return f*x;
}
struct stt{
    ll siz,len;//元素个数,对齐 
    string nam[105],lx[105];//名,类型 
    map<string,int> mp;//成员对应编号 
    ll cd;
}x;
struct mem{
    string lx;//类型
    ll l,r;//所占区间 
};
map<string,stt> m;
map<string,mem> me;
map<string,int> nxt;
int n,opt,d;
string s,ss,sss;
ll mx=-1;
vector<pair<string,string> > g;
bool flag;
void ak(string a,ll val){
//  puts("fc");
    if(val<0){
        flag=1;
        return ;
    }
    ll now=0;
    stt b=m[me[a].lx];
    if(val>=b.cd){
        flag=1;
        return ;
    }
    nxt[a]=-1;
    for(int i=1;i<=b.siz;i++){
        ll now2=now+m[b.lx[i]].cd;
        now2=(now2+m[b.lx[i]].len-1)/m[b.lx[i]].len*m[b.lx[i]].len;
        if(now2>val){
            me[b.nam[i]].lx=b.lx[i];
            ak(b.nam[i],val-now);
            if(!flag) nxt[a]=i;
            break;
        }
        else now=now2;
    }
    if(nxt[a]==-1&&b.siz) flag=1;
}
int main(){
    freopen("struct.in","r",stdin);
    freopen("struct.out","w",stdout);
    n=read();
    m["byte"].len=m["byte"].cd=1,m["short"].len=m["short"].cd=2,m["int"].len=m["int"].cd=4,m["long"].len=m["long"].cd=8;
    while(n--){
        opt=read();
        if(opt==1){
            cin>>s,x.siz=read(),x.len=0,x.cd=0,x.mp.clear();
            for(int i=1;i<=x.siz;i++){
                cin>>x.lx[i]>>x.nam[i],x.mp[x.nam[i]]=i;x.len=max(x.len,m[x.lx[i]].len);
            }
//          puts("A");
            for(int i=1;i<=x.siz;i++)
                x.cd=((m[x.lx[i]].cd+x.cd+m[x.lx[i]].len-1)/m[x.lx[i]].len)*m[x.lx[i]].len;
//          puts("b");
            x.cd=(x.cd+x.len-1)/x.len*x.len;
            m[s]=x;
            printf("%lld %d\n",x.cd,x.len);
        }
        else if(opt==2)
            cin>>s>>ss,me[ss].lx=s,me[ss].l=mx+1,me[ss].r=mx+m[s].cd,g.push_back(make_pair(s,ss)),
            mx=(me[ss].r+m[s].len-1)/m[s].len*m[s].len-1,printf("%lld\n",me[ss].l);
        else if(opt==3){
            cin>>s,ss="";
            ll ans=0;
            for(int i=0;i<s.size();i++)
                if(s[i]^'.') ss+=s[i];
                else{
                    ans=me[ss].l;
                    break;
                }
//          cout<<ss<<'\n';
            sss="";
            for(int i=ss.size()+1;i<s.size();i++)
                if(s[i]^'.') sss+=s[i];
                else{
                    x=m[me[ss].lx];
                    int pos=x.mp[sss];
//                  cout<<pos<<'\n';
                    ll now=0;
                    for(int j=1;j<pos;j++)
                        now=((now+m[x.lx[j]].cd+m[x.lx[j]].len-1)/m[x.lx[j]].len)*m[x.lx[j]].len;
                    now=(now+m[x.lx[pos]].len-1)/m[x.lx[pos]].len*m[x.lx[pos]].len;
                    ans+=now;
                    me[sss].lx=x.lx[pos];
                    ss=sss,sss="";
                }
            x=m[me[ss].lx];
            int pos=x.mp[sss];
//          cout<<ss<<' '<<sss<<' '<<pos<<'\n';
            ll now=0;
            for(int j=1;j<pos;j++)
                now=((now+m[x.lx[j]].cd+m[x.lx[j]].len-1)/m[x.lx[j]].len)*m[x.lx[j]].len;
            now=(now+m[x.lx[pos]].len-1)/m[x.lx[pos]].len*m[x.lx[pos]].len;
            ans+=now;
            printf("%lld\n",ans);
        }
        else{
            d=read(),flag=0;
//          bool flg=0;
            for(int i=0;i<g.size();i++)
                if(me[g[i].second].r>=d){
                    ak(g[i].second,d-me[g[i].second].l);
                    if(!flag){
                        s=g[i].second;
                        cout<<s,s=m[me[s].lx].nam[nxt[s]];
                        while(1){
                            cout<<'.'<<s;
                            if(~nxt[s]) s=m[me[s].lx].nam[nxt[s]];
                            else break;
                        }
                        putchar(10);
                    }
                    else puts("ERR");
                    break;
                }
            if(g.size()&&me[g[g.size()-1].second].r<d) puts("ERR");
//          printf("%d\n",n);
        }
    }
    return 0;
}
/*
5
1 a 2
short aa
int ab
1 b 2
a ba
long bb
2 b x
3 x.ba.ab
4 10
*/

|