CSP-S 提高级 · CSP 2026 提高级第一轮 第 13 题

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

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

题目

【单选】字符串 S = "ababaabab",其所有既是真前缀又是真后缀的子串(非空)的长度之和是( )。

答案:B

考点

KMP算法 讲解 →KMP算法 真题汇总 →字符串算法二分答案

解题思维

逐一比较 S 的前缀与后缀,找出所有既是真前缀又是真后缀(且非空)的子串:长度 2 的 "ab" 与长度 4 的 "abab",长度和为 6。也可以用 KMP 的 next 数组沿失败链跳。

常见错误

把 "ababaabab" 本身(长度 9)也算进"真前缀/真后缀"(真 = 不比原串长);或者漏掉较短的 "ab"。

详细解析(节选)

解析

本题考查字符串的前后缀(border)识别,也是 KMP 算法 next 数组的直接应用。

定义回顾

"既是真前缀又是真后缀的非空子串"称为 border(真前缀/真后缀 = 不等于原串本身)。

S = ababaabab(长度 9)

方法一:逐一比对

长度作为前缀作为后缀是否相同
1ab✗
2abab✓
3ababab✗
4abababab✓
5ababaaabab✗
6ababaabaabab✗
7ababaababaabab✗
8ababaabababaabab✗
9原串本身—不算(非"真")

满足条件的长度是 2 和 4,长度之和 = 2 + 4 = 6,选 B。

方法二:KMP 的 next 数组(更快)

计算 S 的前缀函数 π(π[i] 表示前 i 个字符的最长 border 长度):

i123456789
字符ababaabab
π[i]001231234

π[9] = 4 → 最长 border 是 abab(长度 4); 再沿失败链跳:π[4] = 2 → 下一个 border 是 ab(长度 2); π[2] = 0 → 结束。

所有 border 长度:4, 2 → 和为 6 ✓

其他选项为什么错

记忆点

同考点真题

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