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`。