T530081 RUST

题目背景

你说得对,但是《Rust》是由 Mozilla 自主研发的一款全新零开销抽象编程语言。语言发生在一个被称作「RAII」的资源管理世界,在这里,退出作用域的对象将被授予「drop」方法,回收资源之力。你将扮演一位名为「Ferris」的神秘角色在编码的旅行中邂逅形状各异、生命周期独特的变量们,和它们一起击败强大的编译错误,找回失散的内存安全——同时,逐步发掘「Servo」的真相。

题目描述

你被赋予了一个管理内存块的任务。你的目标是编写一个程序,模拟一段简化的内存管理逻辑,确保在程序执行期间没有发生“悬垂指针”或“重复释放”的情况。 具体来说,给定一个由 `n` 个内存块组成的数组,每个内存块都有唯一的编号。你需要根据一系列操作来分配和释放这些内存块: - 操作 `"alloc x"` 表示分配编号为 `x` 的内存块。 - 操作 `"free x"` 表示释放编号为 `x` 的内存块。 释放过后的内存块视为未被分配的内存块。 要求确保: 1. 不能释放未被分配的内存块 2. 不能分配已被分配的内存块 3. 所有内存块编号为 $1$ 到 $n$ 请实现一个程序,根据输入的操作序列,判断是否出现了非法操作。如果出现非法操作,请输出 `Illegal operation`,否则输出 `All operations are safe`。 只有通过了所有测试点,你才能取得本题的分数。

输入格式

- 第一行输入两个整数`n`和`m`,分别表示内存块的数量和接下来操作的数量 - 接下来输入`m`行,每行表示一个操作(`alloc x` 或 `free x`)。

输出格式

- 如果所有操作都合法,输出 `All operations are safe`。 - 如果有任何非法操作,输出 `Illegal operation`。

说明/提示

- 1 ≤ n ≤ 1000 - 每个操作的合法编号范围为 1 到 n。 对于样例 #2 的解释 1. `alloc 1`:分配编号为 1 的内存块,合法。 2. `free 1`:释放编号为 1 的内存块,合法。 3. `free 1`:再次释放编号为 1 的内存块,但编号 1 已经释放过,属于非法操作。 4. `alloc 5`:请求分配编号为 5 的内存块,但给定的编号范围是 1 到 3,因此编号 5 超出范围,属于非法操作。 由于在第 3 和第 4 步都出现了非法操作,程序应输出 `Illegal operation`。