#P1025. [CSP-S 2023] 结构体

[CSP-S 2023] 结构体

模拟一个具有内存对齐规则的类型系统。基本类型 byte\texttt{byte}short\texttt{short}int\texttt{int}long\texttt{long} 的大小与对齐要求分别为 1,2,4,81,2,4,8 字节。

结构体成员按定义顺序排列。每个成员的起始地址是:不小于上一个成员结束位置,且满足自身对齐要求的最小地址。结构体的对齐要求为其所有成员对齐要求的最大值,最终大小也必须向上补齐到该对齐要求的倍数。

结构体定义本身不占内存,可以使用此前定义的类型。全局元素从地址 00 起顺序分配,元素起点同样需要满足对齐要求。

需要处理以下四类操作:

  1. 定义结构体类型,输出其大小与对齐要求。
  2. 定义全局元素,输出其起始地址。
  3. 使用形如 对象.成员.成员\texttt{对象.成员.成员} 的访问路径访问已有元素或成员,输出其起始地址;允许访问结构体本身。
  4. 给出一个地址:若该字节属于某个基本类型元素,输出其完整访问路径;若位于对齐填充区或未分配区,输出 ERR\texttt{ERR}

类型名与全局元素名互不重复;同一结构体内成员名互不重复。不同结构体的成员名可以相同,也可以与类型名或全局元素名相同。

输入格式

第一行一个整数 nn,表示操作数。

操作 11 的格式为 1 s k1\ s\ k,随后给出 kk 行,每行包含一个类型和一个成员名。操作 22 的格式为 2 类型 元素名2\ \text{类型}\ \text{元素名};操作 33 的格式为 3 访问路径3\ \text{访问路径};操作 44 的格式为 4 地址4\ \text{地址}

输出格式

对每个操作输出一行对应结果。

样例 1

5
1 a 2
short aa
int ab
1 b 2
a ba
long bb
2 b x
3 x.ba.ab
4 10
8 4
16 8
0
4
x.bb

数据范围与原题特殊限制

对于全部数据,满足 1n1001 \leq n \leq 1001k1001 \leq k \leq 1000addr10180 \leq addr \leq 10^{18}

所有定义的结构体类型名、成员名称和定义的元素名称均由不超过 1010 个字符的小写字母组成,且都不是 byte,short,int,long(即不与基本类型重名)。

所有定义的结构体类型名和元素名称互不相同,同一结构体内成员名称互不相同。但不同的结构体可能有相同的成员名称,某结构体内的成员名称也可能与定义的结构体或元素名称相同。

保证所有操作均符合题目所述的规范和要求,即结构体的定义不会包含不存在的类型、不会访问不存在的元素或成员等。

保证任意结构体大小及定义的元素占据的最高内存地址均不超过 101810^{18}

测试点 特殊性质
11 A、D
232\sim 3 A
454\sim 5 B、D
686\sim 8 B
9109\sim 10 C、D
111311\sim 13 C
141614\sim 16 D
172017\sim 20

特殊性质 A:没有操作 11

特殊性质 B:只有一个操作 11

特殊性质 C:所有操作 11 中给出的成员类型均为基本类型;

特殊性质 D:基本类型只有 long

来源与数据说明

原题页面。以上题意为重新整理的表述,规则、输入输出和约束与原题一致。本题使用独立生成的训练数据,原题测试点表仅说明原比赛范围与特殊性质,本包评分不复刻官方测试点分布。标准输入输出,不要求文件读写。