跳转至

连续内存中的字符串函数

预估时间限制: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)\) 起的字符串长度。需要读取结束字节,但长度不计这个字节。

每次操作先完整检查,按以下优先级处理:

  1. 若所需读写的任一地址不在 \([0,S)\) 中,输出 overflow ,整个操作不修改内存。字符串直到内存末尾仍没有结束字节,也属于此情况。
  2. 对复制操作,若源区间和目标区间存在公共地址,输出 overwrite ,整个操作不修改内存。两个区间都包括结束字节;仅当没有全局非法地址时才检查这一项。
  3. 其余操作正常执行。若有读写地址超出该指针所指定数组的范围,就在正常结果前加一个 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% 无额外条件