连续内存中的字符串函数¶
预估时间限制:0.5 秒。内存限制:128 MB。
实际时限以标准程序在目标评测环境的最慢用例中位时间乘以 \(2\) ,按 \(0.5\) 秒向上取整。参考环境见评测说明。
背景故事¶
一台旧式教学终端把几个字符数组紧挨着存储。维护人员要逐条检查操作:有些操作完全合法,有些会碰到相邻数组,还有些必须在执行前拒绝。
(本故事由GPT-6重写)
形式化问题描述¶
有 \(n\) 个数组,编号为 \(0,\ldots,n-1\) .数组 \(i\) 长度为 \(m_i\) ,各元素只能是 \(0\) 或 \(1\) .数组按编号连续存放,数组间没有空隙。令 \(p_0=0\) 、\(p_i=\sum_{j<i}m_j\) 、\(S=\sum_i m_i\) ,则指针 \((x,y)\) 指全局地址 \(p_x+y\) .偏移 \(y\) 可以为负。
顺序执行以下操作;每次读取的都是此前成功操作留下的内存。
0 x y v c:从指针 \((x,y)\) 起,把连续 \(c\) 个字节写成 \(v\) .成功输出true.1 x y z w:把指针 \((x,y)\) 起的字符串复制到 \((z,w)\) .字符串在首个值为 \(0\) 的字节结束,复制包括这个结束字节。成功输出true.2 x y:求指针 \((x,y)\) 起的字符串长度。需要读取结束字节,但长度不计这个字节。
每次操作先完整检查,按以下优先级处理:
- 若所需读写的任一地址不在 \([0,S)\) 中,输出
overflow,整个操作不修改内存。字符串直到内存末尾仍没有结束字节,也属于此情况。 - 对复制操作,若源区间和目标区间存在公共地址,输出
overwrite,整个操作不修改内存。两个区间都包括结束字节;仅当没有全局非法地址时才检查这一项。 - 其余操作正常执行。若有读写地址超出该指针所指定数组的范围,就在正常结果前加一个
w,中间没有空格。
源指针与目标指针分别按各自指定的数组判断警告。检查中发现的警告不会给 overflow 或 overwrite 加前缀。特别地,\(c=0\) 的写入不访问任何地址,始终输出 true ,即使指针位于全局内存之外。
输入格式¶
第一行是 \(n\) .第二行是 \(n\) 个长度 \(m_i\) .接下来 \(n\) 行,第 \(i+1\) 行给出数组 \(i\) 的 \(m_i\) 个初始元素。下一行是操作数 \(k\) ,随后 \(k\) 行按上述格式给出操作。
输出格式¶
每次操作输出一行,内容为长度、true 、带警告前缀的正常结果,或对应的错误字符串。
样例¶
样例 1¶
输入¶
2
3 3
1 1 0
1 0 0
5
2 0 0
1 0 0 1 0
2 1 0
0 0 3 0 1
2 1 0
输出¶
2
true
2
wtrue
0
样例 2¶
输入¶
1
3
1 1 0
6
1 0 0 0 1
1 0 0 0 0
0 0 -1000000000 1 0
2 0 0
0 0 2 1 1
2 0 0
输出¶
overflow
overwrite
true
2
true
overflow
样例 3¶
输入¶
3
3 2 4
1 0 1
1 1
1 0 0 1
19
0 2 3 1 1
0 2 4 1 0
0 2 4 1 1
0 1 2 1 1
2 0 1
2 0 0
2 0 1
2 0 3
2 0 5
2 1 -1
2 2 2
2 2 3
2 0 5
1 0 1 2 100
1 0 1 2 0
2 1 1
1 0 2 1 0
2 0 2
1 1 1 2 2
输出¶
true
true
overflow
wtrue
0
1
0
w3
w1
w4
0
overflow
w1
overflow
true
w1
overwrite
w3
wtrue
样例解释¶
样例 1 中,第一次复制把 1 1 0 写入数组 1。之后通过数组 0 的越界指针修改了数组 1 的首字节,因此输出 wtrue .样例 2 先展示全局越界优先于重叠,再展示复制到自身的重叠错误与零长度写入。样例 3 展示跨多个数组的访问和失败后的内存状态。
图示样例 1 的复制;虚线是数组边界,全局地址连续。
数据范围与保证¶
所有数据满足 \(1\le n\) ,\(1\le m_i\) ,\(S\le1000\) ,\(1\le k\le50000\) .所有数组编号合法,所有偏移绝对值不超过 \(10^9\) ,\(0\le c\le10^9\) ,初始字节及写入值都属于 \(\{0,1\}\) .
规格由 Codex(GPT-6)重新设计:明确变长数组的总长度限制、操作原子性及各类边界的判定顺序。
| 分值比例 | 额外条件 |
|---|---|
| 20% | \(S\le20\) ,\(k\le100\) |
| 30% | \(S\le100\) ,\(k\le1000\) |
| 50% | 无额外条件 |