【KMP】Ybt_子串拆分
发布日期:2021-05-07 22:47:32 浏览次数:18 分类:精选文章

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


跟有点像。

改一改,每次跑一遍kmp,然后跳回的时候不用跳到最小,跳回到k或以上,且串B的长度>=1就行了。


代码

#include 
#include
#include
#include
using namespace std;string a, b;int j, n, l, k, kmp[1000010], f[1000010];long long ans;void work() { kmp[0] = kmp[1] = j = 0; n = a.size() - 1; for (int i = 2; i <= n; ++i) { while (a[i] != a[j + 1] && j) j = kmp[j]; if (a[i] == a[j + 1]) ++j; kmp[i] = j; l = j; while (l >= k) { if (l * 2 + 1 <= i) { ++ans; break; } l = kmp[l]; } } a.erase(1, 1); //删位}int main() { cin >> a; cin >> k; a = " " + a; while (a.size() > 2 * k + 1) work(); printf("%d", ans);}
上一篇:【Trie树】Ybt_前缀统计
下一篇:【哈希】洛谷P7469 [NOI Online 2021 提高组] 积木小赛(民间数据)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年03月25日 04时32分18秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章