T6 题解
2025-02-24 10:59:56
发布于:浙江
20阅读
0回复
0点赞
大家在日常编程中可能频繁使用哈希算法,这里为大家介绍一种KMP算法的解法。我们知道,KMP算法中有一个next数组,那么它究竟是什么含义呢?当匹配过程中出现失配时,模式串会回退到前面的某个位置,而next数组就决定了这个回退位置。具体来说,失配位置对应的最长公共真前后缀的长度,决定了模式串回退的位置。基于此,我们可以借助next指针来进行相关计算。
首先,对匹配串执行一遍KMP算法。然后,创建一个桶数组,用于记录模式串中每个最长前缀的出现次数。最后,结合next数组进行一次拓扑排序,完成相关统计工作。
string a, b;
cin >> a >> b;
//计算a中每一个点匹配到b的哪个位置
auto t = find_occurrences(a, b);
//next函数
auto z = prefix_function(b);
// debug(z);
int nn = b.size();
vector<int> bn(nn + 1);
for (auto i: t)bn[i]++;
//拓扑
for (int i = nn; i; i--) {
// debug(z[i- 1], i);
bn[z[i - 1]] += bn[i];
}
int k;
cin >> k;
for (int i = nn; i; i--) {
if (bn[i] >= k) {
cout << b.substr(0, i) <<endl;;
return;
}
}
cout << "IMPOSSIBLE" << endl;
时间复杂度O(n)
全部评论 2
%%%
2025-02-24 来自 广东
0唯一问题,为什么暴力算法可以过
2025-02-24 来自 浙江
0
有帮助,赞一个