【题解】洛谷P2375 [NOI2014] 动物园(KMP)
洛谷P2375:https://www.luogu.org/problemnew/show/P2375
思路
这道题可以说是完全刷新了本蒟蒻对KMP的理解
感觉对next数组的理解上升到一个新的高度
首先题目给出了next数组的定义
关于整个字串 next[len]为前缀与后缀相同的最长长度
我们给出一张从你谷题解中扒下来的图

我们可以观察到对于整个长度为len的字串a
next[len],next[next[len]],next[next[next[len]]]...全部都是满足前缀与后缀相同的子串
但是仅仅把这些加起来是不足以解决这道题的
因为题目要求的是不重叠 因此我们需要判断这个子串长度是否大于此前缀i长度的一半 我们设cnt数组为有重叠的 再从中筛选
因为考虑到时间效率 我们需要用求next数组的方法求num数组
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
#define maxn 1000010
#define mod 1000000007
ll cnt[maxn],next[maxn];
ll len,ans;
char a[maxn];
int T;
void kmp()
{
ll j=;
for(ll i=;i<=len;i++)
{
while(j&&a[i]!=a[j+]) j=next[j];
if(a[i]==a[j+]) j++;
next[i]=j;
cnt[i]=cnt[j]+;//递推公式
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(cnt,,sizeof(cnt));
memset(next,,sizeof(next));
ans=;//初始化
scanf("%s",a+);
len=strlen(a+);
cnt[]=;//初始化
kmp();
ll j=;
for(ll i=;i<=len;i++)
{
while(j&&a[i]!=a[j+]) j=next[j];
if(a[i]==a[j+]) j++;
while((j<<)>i) j=next[j];//不断缩小范围直到小于原前缀i长度的一半
ans*=(cnt[j]+);//统计ans
ans%=mod;
}
printf("%lld\n",ans);
}
}
【题解】洛谷P2375 [NOI2014] 动物园(KMP)的更多相关文章
- 洛谷 P2375 [NOI2014]动物园 解题报告
P2375 [NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定 ...
- [洛谷P2375] [NOI2014]动物园
洛谷题目链接:[NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决 ...
- 【KMP】洛谷P2375 [NOI2014]动物园 题解
一开始的方向应该对了,但是没有想到合理的优化还是没写出来…… 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己 ...
- 洛谷 P2375 [NOI2014]动物园
题目传送门 解题思路: 其实对于一个sum[i],其值就等于sum[next[i]] + sum[next[next[i]]] + ... + 1,然后我们可以记忆化,然后题目里又有一个限制,就是前后 ...
- 洛谷2375 NOI2014动物园(KMP)
题目链接: 题目. 简单一点来说,这个题就是求一个字符串的\(num\)数组的和,其中有\(num[i]\)表示1~i中有多少个不交叉的相等的前缀和后缀 的数目,要求一个\(O(n)\)的做法 QwQ ...
- P2375 [NOI2014]动物园 KMP
好,暴力能拿$50pts\space qwq$ 暴力的思路就是一直跳$nxt[j]$,直到它的长度小于串的一半,然后开始计数,当然要接着跳$nxt[j]$ 正解:考虑没有长度要求的(不要求不重合)公共 ...
- 2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)
2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分) https://www.luogu.com.cn/problem/P2375 题意: PS:这道神题的背景让人疑惑,重 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 洛谷 P2375 动物园
题目详情 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法 ...
随机推荐
- RabbitMQ如何解决各种情况下丢数据的问题
1.生产者丢数据 生产者的消息没有投递到MQ中怎么办?从生产者弄丢数据这个角度来看,RabbitMQ提供transaction和confirm模式来确保生产者不丢消息. transaction机制就是 ...
- 4、springboot之全局异常捕获
1.新建一个springboot项目 添加一个全局异常的类 import org.springframework.web.bind.annotation.ControllerAdvice; impor ...
- C Primer Plus 读后感
<C Primer Plus>中文版 第六版 从网站上搜索到这本书适合初学者而且是自学者可以看的C语言书籍,于是上网买了一本. 真是物有所值,通过本书我很系统的学习了一遍C语言,书中代码很 ...
- CakePHP redirect函数
public function getContract($value=''){ App::uses ( 'UserContractController', 'Controller' ); $Contr ...
- <%@ page isELIgnored="false"%>的作用
JSP 2.0的一个主要特点是它支持表达语言(expression language).JSTL表达式语言可以使用标记格式方便地访问JSP的隐含对象和JavaBeans组件,JSTL的核心标记提供了流 ...
- Goodbye Bingshen
在uoj上打的第二场比赛......还凑合(卧槽C题80分没了QAQ 第一次接触交互题还挺好玩的哈哈 可能是人比较多吧.....rating涨了不少...... 现在我rating正好比lrd高1哈哈 ...
- ArrayList的使用方法详解(转)
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和I ...
- 项目经验:GIS<MapWinGIS>建模第三天
记录下GIS工程进展
- 关于比特币的“冷存储”和Armory的使用
转自:http://8btc.com/thread-1164-1-1.html 最近随着比特币话题的火热,又有一批人卖房或倾产换成比特币入圈,这一次与以前不同的是,以前倾产入圈的人都是技术人员,有足够 ...
- idea打jar包
昨天碰到个问题:使用idea打成jar包,但是在测试环境一直报错.参考: http://blog.csdn.net/aotian16/article/details/52198378 之后发现原来的j ...