【洛谷 P2375】 【kmp】 动物园

该博客介绍了如何使用KMP算法解决洛谷P2375题目的动物园问题。作者阐述了KMP算法中next数组的含义,并提出一个弱化版的num变量来寻找不重叠的前缀后缀长度。通过计算可重叠的前缀后缀长度ans,并利用next数组优化,避免了重复计算。最终,博主提供了求解所有(num+1)乘积的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【洛谷 P2375】 【kmp】 动物园

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


解题思路

学过kmp的小朋友们肯定知道next维护的是既是它前缀又是它后缀的长度
题目讲的一级棒
那么我们可以从这推出一个弱化版的num
num求的是不重叠的又是前缀又是后缀的长度
设一个ans求的是可重叠的又是前缀又是后缀的长度
求ans[i]即是ans[next[i]]+1
next[i]本身就既是它的前缀也是它的后缀,所以next[i]的前缀也会是i的前缀
因为最后num求的是不重叠的
所以我们要保证k 就是i最长的一个不重叠前缀的长度
那么可以用求next时的方法一直往前跳,直到小于i的一半
最后求ans[k]+1与答案相乘 +1是因为它本身也是i的前缀
题目要求的是所有(num+1)的乘积,为了不用每次再加1,给ans[1]初值为1


代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int mo=1000000007;
char s[1000010];
int n,len,ans[1000010],next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值