CSP-S 提高级 · CSP 2025 提高级第一轮 第 2 题

选择题 · 答案 A · 考点:字符串算法、KMP算法

← 整套速查表 CSP-S 提高级 全部真题

题目

在 KMP 算法中,对于模式串 $P = \tt{abacaba}$,其 next 数组(next[i] 定义为模式串 $P[0..i]$ 最长公共前后缀的长度,且数组下标从 0 开始)的值是什么?

答案:A

考点

字符串算法KMP算法 讲解 →KMP算法 真题汇总 →

解题思维

这题就是考 KMP 里 next 数组的原始定义。拿到串先别急着套代码,从长度 1 开始,一位一位加,看能不能在刚才找到的最长公共前后缀基础上再往前多拼一个字符;拼不上就回退到前一位的 next 值继续找,直到拼成或回退到 0。

常见错误

最容易栽跟头的就是把 next 和 prefix 数组搞混。prefix[i] 通常存的是 P[0..i] 最长公共前后缀长度,而题目明确说 next[i] 就是这个值,但很多同学习惯用 KMP 代码里那种 next[i] 表示 P[0..i-1] 的 LCP,导致算出来的数组整体右移一位。另外,计算时往往忘记“不能是字符串本身”这个限制,把整个串当成前后缀,或者在回退时没有正确利用前一位的 next 值,直接重新从头找,这样就会多算或少算,比如把 P[3] 算成 1 而不是 0。

详细解析(节选)

考察知识点

字符串算法 — KMP 算法

概念定义

- 前缀:从第一个字符开始连续的子串。 - 后缀:以最后一个字符结束连续的子串。 - 公共前后缀:既是前缀又是后缀的子串,且长度必须小于子串本身(不能是整个串)。例如 "aba" 的前缀有 a, ab, aba;后缀有 a, ba, aba;公共的是 a(长度 1)。

命题视角

命题人喜欢考这种“定义陷阱”。KMP 的 next 数组在教材和代码实现中有多种变体(有的从 1 开始,有的存的是前一位的 LCP),但本题白纸黑字给出了定义:next[i] 就是 P[0..i] 的 LCP 长度。这意味着我们不需要记忆代码里的具体写法,只需要按定义手工模拟即可。这类题往往出现在单选里,目的是考察你对概念本质的理解,而不是对某段特定代码的背诵。

思考心法

拿到题先想什么? 1. 逐位推进:从 i=0 开始,一位一位地往右看。 2. 尝试扩展:假设 P[0..i-1] 的 LCP 长度是 k,那么 P[0..k-1] 就是当前的候选前后缀。检查 P[k] 是否等于 P[i]。如果相等,说明我们可以把长度加 1,即 next[i] = k+1。 3. 回退机制:如果不相等,说明当前的 k 太大了,需要缩小。怎么缩?直接跳到 next[k-1] 对应的长度再试。因为 next[k-1] 已经是 P[0..k-1] 的最长公共前后缀长度,它对应的子串肯定也是 P[0..k] 的前缀,我们只需检查 P[next[k-1]] 是否等于 P[i]。 4. 兜底:如果回退到 0 还是不等,那 next[i] 就是 0。

具体计算(P = abacaba)

得到数组:{0, 0, 1, 0, 1, 2, 3}。

避坑指南

考频与趋势

从数据看,KMP 在 CSP 提高级里属于低频但稳定的考点,2025 年已经连续两年出现,且 2025 年字符串算法整体爆发(3 题),说明命题人正在加大字符串相关内容的比重。

预测

基于现有数据,KMP 在 CSP 提高级中未来 1-2 年内仍有一定概率出现,但大概率会保持低频(每年 0-1 题)。不过,既然 2025 年字符串算法题量明显上升,命题趋势显示字符串类题目正在升温,因此 KMP 或其变体(如 Z 函数、Manacher)在未来考试中出现的概率会略微提高。暂无足够依据预测具体年份和题量,但建议复习时把 KMP 的多种 next 定义版本都过一遍,以防命题人换个马甲再来考。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断