自己改了好久都不会,求神犇指教
  • 板块题目总版
  • 楼主clx201022
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/30 20:24
  • 上次更新2023/11/30 22:16:07
查看原帖
自己改了好久都不会,求神犇指教
552688
clx201022楼主2023/11/30 20:24

帖子
题目
代码:

//https://www.luogu.com.cn/problem/P9754
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct member
{
  string type,name;//类型 名字
  ll begin_addr;
};
struct Type
{
  ll duiqi,space;
  vector<member>members;
};
map<string,Type>type_memory;
ll next_addr=0;//下一个存在哪
vector<member>memory;//都是内存这个大结构体的成员
void caozuo1()
{
  ll k=0,max_duiqi=0;
  ll next_addr=0;//结构体内的虚拟内存
  string s,t,n;
  vector<member>zzz(0);
  cin>>s>>k;
  for(int i=1;i<=k;i++)
  {
    cin>>t>>n;//类型 名字
    if(!type_memory.count(t))
    {
      cout<<"undefined type name "<<t<<"\n";
      continue;
    }//未定义类型
    const auto zzz2=type_memory[t];//暂存
    while(zzz2.duiqi!=0&&next_addr%zzz2.duiqi!=0)++next_addr;//对齐
    zzz.push_back(member{t,n,next_addr});//存入元素
    next_addr+=zzz2.space;//移动指针
    max_duiqi=max(max_duiqi,zzz2.duiqi);//最大对齐
  }
  type_memory[s]=Type{max_duiqi,next_addr,zzz};//存储
  cout<<next_addr<<' '<<max_duiqi<<'\n';
  return;
}
void caozuo2()
{
  string t="\0",n="\0";
  cin>>t>>n;
  if(!type_memory.count(t))
  {
    cout<<"undefined type name "<<t<<"\n";
    return;
  }//未定义
  const auto zzz2=type_memory[t];//暂存
  while(zzz2.duiqi!=0&&::next_addr%zzz2.duiqi!=0)++::next_addr;//对齐
  memory.push_back(member{t,n,next_addr});//存入元素
  cout<<::next_addr<<'\n';
  ::next_addr+=zzz2.space;//移动指针
  return;
}
void caozuo3()
{
    string s,zzz;
    ll ptr=0;
    queue<string>q;
    ll k;
    member m;
    cin>>s;
    zzz.clear();
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='.')
        {
            q.push(zzz);
            zzz.clear();
        }
        else
            zzz+=s[i];
    }
    if(!zzz.empty())
        q.push(zzz);//分割
    zzz.clear();
    s.clear();
    if(q.empty())
    {    
        //throw "empty_q";
        cout<<'\n';
        return;
    }
    for(k=0;k<memory.size();k++)
    {
        if(memory[k].name==q.front())
            goto success;
    }
    cout<<"undefined name "<<q.front()<<"\n";
    return;//未定义
    success:
    m=memory[k];
    ptr+=m.begin_addr;
    q.pop();
    while(!q.empty())
    {
        for(k=0;k<type_memory[m.type].members.size();k++)
        {
            if(type_memory[m.type].members[k].name==q.front())
                goto success2;
        }
        cout<<"undefined name "<<q.front()<<"\n";
        return;//未定义
        success2:
        m=type_memory[m.type].members[k];
        ptr+=m.begin_addr;
        q.pop();
    }
    cout<<ptr<<'\n';
    return;
}
void caozuo4()
{
    string wer;
    ll addr=0,now_addr=0;
    ll k;
    member m;
    wer.clear();
    cin>>addr;
    for(k=0;k<memory.size();k++)
    {
        if(memory[k].begin_addr+now_addr>addr)
            break;
    }
    k-=1;
    if(k<0)
    {
        cout<<"ERR"<<'\n';
        return;
    }
    m=memory[k];
    now_addr=m.begin_addr;
    wer=m.name;
    while(1)
    {
        for(k=0;k<type_memory[m.type].members.size();k++)
        {
            if(type_memory[m.type].members[k].begin_addr+now_addr>addr)//只要大了就说明要么是前面的 要么是空位
               break;
        }
        k-=1;
        if(k<0)
        {
            break;
        }
        m=type_memory[m.type].members[k];
        now_addr+=m.begin_addr;
        wer+='.';
        wer+=m.name;
    }
    //cout<<now_addr<<' '<<type_memory[m.type].space<<' ';
    if(now_addr+type_memory[m.type].space<=addr)//从零开始 所以 <=
        cout<<"ERR";
    else
        cout<<wer;
    cout<<'\n';
    return;
}
int main()
{
  type_memory["byte"]=Type{1,1,vector<member>(0)};
  type_memory["short"]=Type{2,2,vector<member>(0)};
  type_memory["int"]=Type{4,4,vector<member>(0)};
  type_memory["long"]=Type{8,8,vector<member>(0)};
  int n=0;
  cin>>n;
  for(int op=0;n--;)
  {
    cin>>op;
    switch(op)
    {
      case 1:
      caozuo1();
      break;
      case 2:
      caozuo2();
      break;
      case 3:
      caozuo3();
      break;
      case 4:
      caozuo4();
      break;
    }
  }//操作
  return 0;
}
/*
struct a
{
    short aa;
    int ab;
}
struct b
{
    a ba;
    long bb;
}
b x;
print &x.ba.ab;
a:
y byte
s short
i int
l long
a:
ss--iiii
b:
ss--iiiiss--iiii
*/
2023/11/30 20:24
加载中...