codeforces432D[kmp的next数组的运用]
发布日期:2021-05-08 21:58:40 浏览次数:16 分类:精选文章

本文共 1041 字,大约阅读时间需要 3 分钟。

解题思路:通过递归嵌套的方式不断处理字符串,统计子串出现的个数

为了实现对子串出现次数的统计,我们采用递归的方式不断处理字符串。这种方法类似于前缀和的思想,从后往前遍历字符串,根据当前字符与前缀匹配的情况,将较大的子串的出现次数累加到较小的子串中。

代码解析:高效处理字符串匹配问题

#include 
#include
const int N = 1e5 + 5;
int n, jump[N], c, r[N], dp[N];
char str[N];
void getJump() {
int k = 0;
n = strlen(str) - 1;
for (int i = 2; i <= n; ++i) {
while (k && str[i] != str[k + 1])
k = jump[k];
if (str[i] == str[k + 1])
k++;
jump[i] = k;
}
}
int main() {
scanf("%s", str);
getJump();
c = 0;
for (int i = jump[n]; i; ++i) {
r[c++] = i;
}
memset(dp, 0, sizeof(dp));
for (int i = n; i; --i) {
dp[i]++;
dp[jump[i]] += dp[i];
}
printf("%d\n", c + 1);
for (int i = c - 1; i >= 0; --i)
printf("%d %d\n", r[i], dp[r[i]]);
printf("%d %d\n", n, dp[n]);
return 0;
}

代码功能:统计子串出现次数

  • 预处理阶段:通过getJump函数构建跳表,记录每个位置的最大前缀匹配长度
  • 构建结果数组:从后往前遍历字符串,记录所有可能的前缀子串
  • 计算出现次数:利用动态规划的方法,统计每个子串的出现次数
  • 这种方法充分利用了前缀匹配的特性,将较大的匹配结果分解到较小的子串中,确保了统计的准确性和效率。

    上一篇:JAVA Volatile关键字 最详细深入理解 Volatile
    下一篇:exkmp解读

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月13日 08时44分12秒