纸老虎序列:分段回溯与有界缓存¶
Codex(GPT-6)提供区间回溯输出,并将出题人的共享后缀方法用于有界缓存。程序:alternative.cpp。这是与共享后缀主解并列的低空间方案。
缓存较短版本¶
设字符缓存上限为 \(B\) ,至少容纳初始串。程序取 \(B=65536\) ,选择最大的 \(h\) ,使 \(L_h\le B\) .用共享后缀法构造 \(S_h\) ,它也包含所有更早的版本。不展开其余版本,只保留长度和增长参数。
回溯一个输出区间¶
定义 \(\operatorname{Emit}(v,s,c)\) ,依次输出 \(S_v\) 从下标 \(s\) 开始的 \(c\) 个字符。
- 若 \(c=0\) ,立即返回。
- 若 \(v\le h\) ,从缓存中相应后缀直接输出这段内容。
- 否则令 \(D=L_v-L_{v-1}\) .旧后缀内的下标 \(s\ge D\) 映射为上一版本的 \(s-D\) .
- 新前缀内的下标映射为 \((p_v+s)\bmod L_{v-1}\) .先分离与前缀相交的部分;如果映射跨越旧串末尾,再拆为末尾和开头两段。最后处理原查询区间中属于旧后缀的部分。
前缀长度 \(D\le L_{v-1}\) ,所以前缀部分最多绕过旧串末尾一次,每次最多产生三个有序子区间。只顺序输出,不拼接中间结果。
正确性与复杂度¶
缓存内容由共享后缀证明保证正确。每次分解严格按照“循环复制前缀,再接旧串”的定义划分区间,映射后的子区间依次覆盖要求的字符且没有遗漏或重复。版本号严格下降,因此对版本号归纳即可证明整个输出正确。
设 \(Z\) 为总输出字符数。缓存构造不超过 \(O(B+N)\) .在每个回溯深度,各个非空输出区间互不重叠,总长度不超过 \(Z\) ;深度最多 \(N+1\) .一个安全的总时间界为 \(O(B+N+(N+1)Z)\) ,空间为 \(O(B+N)\) ,不计标准输出缓冲。该上界不声称与主解具有同样的最坏时间保证。
缓存让递归在较大的连续片段处停止,避免逐字符回溯到初始串。字符区最多约 64 KiB,适合输出较少历史版本或需要减少字符存储的场景。时间与内存比较见主解实测。