
codeforces432D[kmp的next数组的运用]
预处理阶段:通过getJump函数构建跳表,记录每个位置的最大前缀匹配长度 构建结果数组:从后往前遍历字符串,记录所有可能的前缀子串 计算出现次数:利用动态规划的方法,统计每个子串的出现次数
发布日期: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;}
代码功能:统计子串出现次数
这种方法充分利用了前缀匹配的特性,将较大的匹配结果分解到较小的子串中,确保了统计的准确性和效率。