【悬赏2关注】不会大模拟的蒟蒻求调。。。。
查看原帖
【悬赏2关注】不会大模拟的蒟蒻求调。。。。
378706
MoyunAllgorithm楼主2023/11/3 15:25
#include <bits/stdc++.h>
#define PSI pair<string,int>
#define LL long long
#define ls p<<1
#define rs p<<1|1
using namespace std;
struct Type
{
    string ty;
    LL m,dt;
    vector<PSI>g;
}t[115];
map<string,int>mp;
int N,tyt=4;
LL mem=-1;
LL Delta(LL m,int x)
{
    if(m==-1) return 0;
  //  puts("||||");
  //  printf("%lld %d\n",m,x);
    m+=(x-(m%x));
    return m;
}
void dfs1(int u,string s,int p,LL m)
{
   // printf("%d %d %lld\n",u,p,m);
    string ns;
    if(p>s.length())
    {
        m=Delta(m,t[u].dt);
        printf("%lld\n",m);
        return;
    }
    for(int i=p;i<s.length();i++)
    {
        if(i==s.length()-1||s[i]=='.')
        {
            if(i==s.length()-1) i++;
            ns=s.substr(p,i-p);
            p=i+1;
           // if(s[i]=='.'))
            break;
        }
    }
    for(int i=0;i<t[u].g.size();i++)
    {
        string n=t[u].g[i].first;
        int v=t[u].g[i].second;
       // cout<<"Next"<<u<<' '<<v<<' '<<n<<' '<<ns<<endl;
        if(n==ns)
        {
            dfs1(v,s,p,m);
            return;
        }
        m=Delta(m,t[v].dt);
        m+=t[v].m-1;
       // printf
    }
    return;
}
vector<string>ans;
bool err=0;
void dfs2(int u,LL m,LL ask)
{
    //printf("DFS2  %d %lld %lld\n",u,m,ask);
    if(err) return;
    if(t[u].g.size()==0)
    {
        m=Delta(m,t[u].dt);
        LL nm=m+t[u].m-1;
       // printf("%lld %lld\n",m,nm);
        if(ask<m||nm<ask)
        {
            puts("ERR");
            err=1;
            return;
        }
        for(int i=0;i<ans.size();i++)
        {
            cout<<ans[i];
            if(i<ans.size()-1) cout<<".";
        }
        puts("");
        return;
    }
    bool found=0;
    for(int i=0;i<t[u].g.size();i++)
    {
        if(err) return;
        string n=t[u].g[i].first;
        int v=t[u].g[i].second;
        m=Delta(m,t[v].dt)-1;
        LL l=m+1;
        LL r=l+t[v].m-1;
        //printf("This %d %d\n",l,r);
        if(ask<l)
        {
            if(err) return;
            err=1;
            puts("ERR");
            return;
        }
        if(ask<=r)
        {
            ans.push_back(n);
            dfs2(v,m,ask);
            found=1;
            return;
        }
        m=r;
    }
    if(err) return;
    if(!found) puts("ERR"),err=1;
    return;
}
int main()
{
    //freopen("struct3.in","r",stdin);
    scanf("%d",&N);
    t[1].ty="byte",t[2].ty="short",t[3].ty="int",t[4].ty="long";
    t[1].m=t[1].dt=1,t[2].m=t[2].dt=2,t[3].m=t[3].dt=4,t[4].m=t[4].dt=8;
    mp["byte"]=1,mp["short"]=2,mp["int"]=3,mp["long"]=4;
    while(N--)
    {
        int opt;
        scanf("%d",&opt);
        if(opt==1)
        {
            string nam;
            int K;
            cin>>nam;
            scanf("%d",&K);
         //   puts("!!!");
            t[++tyt].ty=nam;
            mp[nam]=tyt;
            LL m=-1,d=-0;
            for(int i=1;i<=K;i++)
            {
                string typ;
                cin>>typ>>nam;
                Type v=t[mp[typ]];
               // cout<<typ<<mp[typ]<<nam<<endl;
                d=max(d,v.dt);
              //  printf("%lld %lld %lld\n",mp[typ],v.m,v.dt);
              //  puts("---");
                m=Delta(m,v.dt);
              //  puts("---");
                m+=v.m-1;
            //    printf("%lld %d %d\n",m,v.m,v.dt);
                t[tyt].g.push_back({nam,mp[typ]});
            }
            t[tyt].m=Delta(m,d);
            t[tyt].dt=d;
           // cout<<nam<<' '<<tyt;
            printf("%lld %lld\n",t[tyt].m,d);
        }
        if(opt==2)
        {
            string typ,nam;
            cin>>typ>>nam;
            Type v=t[mp[typ]];
            mem=Delta(mem,v.dt);
            printf("%lld\n",mem);
            mem+=v.m-1;
            t[114].g.push_back({nam,mp[typ]});
        }
        if(opt==3)
        {
            string s;
            cin>>s;
           // printf("%lld\n",mem);
            dfs1(114,s,0,-1);
        }
        if(opt==4)
        {
            LL m;
            scanf("%lld",&m);
          //  printf("%lld\n",mem);
            ans.clear();
            err=0;
            if(m>mem) puts("ERR");
            else
            {
              //  puts("start a dfs!!!");
                dfs2(114,-1,m);
            }
        }

    }
    return 0;
}
2023/11/3 15:25
加载中...