萌新求助 S 组 T3
  • 板块学术版
  • 楼主OrezTsim
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/10/22 22:09
  • 上次更新2023/10/23 09:05:48
查看原帖
萌新求助 S 组 T3
487752
OrezTsim楼主2023/10/22 22:09

大样例过不了。两个小样例都能过。

#include<bits/stdc++.h>
#define debug cout<<"debug"<<endl
#define int long long
using namespace std;

const int N=1e6+10;
map<string,int>id,trans,sta;
map<pair<int,int>,string>fuck;
// 结构体的编号,其实题目给定的何尝不是四个结构体
// 元素编号依次离散化一下
// 每个元素在它所出现的结构体内的起始位置
int cnt,mem,yuanshen;
// 结构体的编号,当前内存起始位置
string damn[N];

struct element { int beg,typ,siz,align; };
// 在结构体内的起始位置 / 类型 / 大小 / 对齐要求
struct structure {
    int typ,beg,siz,align;
    vector<element>e;
} store[N];
// 结构体类型

int defcnt; structure def[N];
// 实际定义的元素个数 / 实际定义的元素

void init() {
    id["byte"]=1,id["short"]=2,id["int"]=3,id["long"]=cnt=4;
    for(int i=1;i<5;++i) store[i].siz=store[i].align=1<<(i-1);
    for(int i=1;i<5;++i) store[i].typ=i;
}

void solve1() {
    string s; int k; cin>>s>>k;
    // 类型 / 元素数量
    id[s]=++cnt,store[cnt].typ=cnt; int now=0;
    for(int i=1;i<=k;++i) {
        string t,n; cin>>t>>n; int cur=id[t];
        trans[n]=i-1,fuck[{cnt,i-1}]=n;
        element ins; ins={now,cur,store[cur].siz,store[cur].align};
        store[cnt].align=max(store[cnt].align,store[cur].align);
        if(now%ins.align) now=(now/ins.align+1)*ins.align,ins.beg=now;
        sta[n]=now,now+=ins.siz,store[cnt].e.push_back(ins);
    }
    if(now%store[cnt].align) now=(now/store[cnt].align+1)*store[cnt].align;
    store[cnt].siz=now; cout<<now<<' '<<store[cnt].align<<"\n";
}

void solve2() {
    string t,n; cin>>t>>n;
    // 类型 / 名称
    int cur=id[t]; def[++defcnt]=store[cur];
    def[defcnt].typ=cur,trans[n]=defcnt,damn[defcnt]=n;
    if(mem%store[cur].align) mem=(mem/store[cur].align+1)*store[cur].align;
    def[defcnt].beg=mem,cout<<mem<<"\n";
    mem+=def[defcnt].siz;
}

void solve3() {
    string s,tmp=""; cin>>s;
    // 访问的元素
    vector<string>vec;
    for(int i=0;i<s.size();++i) {
        if(s[i]=='.') vec.push_back(tmp),tmp="";
        else tmp+=s[i];
    }
    vec.push_back(tmp);
    int cur=trans[vec[0]],res=def[cur].beg;
    for(int i=1;i<vec.size();++i) res+=sta[vec[i]];
    cout<<res<<"\n";
}

void solve4() {
    int addr,cur=0; cin>>addr;
    for(int i=1;i<=defcnt;++i) if(addr>=def[i].beg) cur=i;
    if(!cur) return cout<<"ERR\n",void();
    addr-=def[cur].beg; int now=def[cur].typ;
    vector<string>res; res.push_back(damn[cur]);
    // for(int i=1;i<=defcnt;++i) cout<<def[i].beg<<' '<<def[i].beg+def[i].siz-1<<endl;
    while(1) {
        // cout<<"NOW: "<<now<<endl;
        // cout<<"ADDR: "<<addr<<endl;
        if(now<5) {
            if(addr>=store[now].siz) return cout<<"ERR\n",void();
            cout<<res[0];
            for(int i=1;i<res.size();++i) cout<<'.'<<res[i];
            return cout<<"\n",void();
        }
        // debug;
        cur=-1;
        for(int i=0;i<store[now].e.size();++i)
            if(addr>=store[now].e[i].beg) cur=i;
        // cout<<"CUR: "<<cur<<endl;
        if(cur<0) return cout<<"ERR\n",void();
        res.push_back(fuck[{now,cur}]);
        addr-=store[now].e[cur].beg;
        now=store[now].e[cur].typ;
    }
}

void solve() {
    int op; cin>>op;
    if(op==1) return solve1();
    if(op==2) return solve2();
    if(op==3) return solve3();
    return solve4();
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0),init();
    cin>>yuanshen;
    while(yuanshen--) solve();
    return 0;
}
2023/10/22 22:09
加载中...