LG2375/LOJ2246 「NOI2014」动物园 KMP改造
问题描述
题解
看了题解,需要回看,需要继续通过本题深入理解KMP。
为了将 \(\mathrm{KMP}\) 和只插入了一个模式串的\(\mathrm{AC}\)自动机有机统一,称通常意义下的 \(\mathrm{KMP}\) 的 \(\mathrm{next}\) 数组为 \(\mathrm{fail}\) 。
通过对 \(\mathrm{num}\) 数组的观察,发现, \(\mathrm{num}\) 数组就是对于每一个前缀,求其公共不重叠前后缀的个数。
由于只有一个串,通过 \(L \le 10^6\) 的线性复杂度的数据规模,可以猜出肯定和 \(\mathrm{KMP}\) 有关。
回顾 \(\mathrm{KMP}\) 中 \(\mathrm{fail}\) 数组的定义,是对于每一个前缀,其 最长公共前后缀的长度 。
对于一个前缀 \(i\) ,\(fail[i]\) 是它的一个公共前后缀,那么 \(fail[fail[i]]\) 也是它的公共前后缀。
可以画图来理解一下:

同理, \(fail[fail[fail[i]]]\) ... 都是前缀 \(i\) 的公共前后缀。
于是通过这个办法递推一下前缀 \(i\) 的公共前后缀数目(允许重叠),这实际上就是 \(\mathrm{num}\) 数组的弱化版,即允许重叠的版本。
实际上,我们求出的这个弱化版数组,就是比实际上的 \(num\) 数组长了一点,所以做第二次 \(\mathrm{KMP}\) 的时候,只需要再让 \(j\) 跳 \(\mathrm{fail}\) ,直到它的一半比 \(i\) 小。
为什么是一半?显然 \(num_i \le \frac{i}{2}\) 。
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
const int maxn=1000000+7;
const int mod=1000000007;
int T,n;
char s[maxn];
int fail[maxn],num[maxn];
void Reset(){
memset(fail,0,sizeof(fail));
}
void KMP(){
num[1]=1;
for(int i=2,j=0;i<=n;i++){
while(j&&s[j+1]!=s[i]) j=fail[j];
if(s[j+1]==s[i]) ++j;
fail[i]=j;num[i]=num[j]+1;
}
}
void solve(){
KMP();
long long ans=1;
for(int i=2,j=0;i<=n;i++){
while(j&&s[i]!=s[j+1]) j=fail[j];
if(s[i]==s[j+1]) ++j;
while((j<<1)>i) j=fail[j];
ans=ans*(((long long)num[j]+1ll)%mod)%mod;
}
printf("%lld\n",ans);
}
int main(){
read(T);
while(T--){
scanf("%s",s+1);n=strlen(s+1);
solve();
}
return 0;
}
LG2375/LOJ2246 「NOI2014」动物园 KMP改造的更多相关文章
- 「NOI2014」动物园
link : https://loj.ac/problem/2246 水水KMP #include<bits/stdc++.h> #define ll long long #define ...
- 「NOI2014」购票 解题报告
「NOI2014」购票 写完了后发现写的做法是假的...然后居然过了,然后就懒得管正解了. 发现需要维护凸包,动态加点,询问区间,强制在线 可以二进制分组搞,然后你发现在树上需要资瓷撤回,然后暴力撤回 ...
- 「NOI2014」购票
「NOI2014」购票 解题思路 先列出 \(dp\) 式子并稍微转化一下 \[ dp[u] =\min(dp[v]+(dis[u]-dis[v]) \times p[u] + q[u])) \ \ ...
- uoj #5. 【NOI2014】动物园 kmp
#5. [NOI2014]动物园 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/5 Description 近日 ...
- 【BZOJ3670】【NOI2014】动物园 [KMP][倍增]
动物园 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 近日,园长发现动物园中好吃懒做的动物 ...
- 【NOI2014】动物园 - KMP
题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法. 某天, ...
- LOJ 3055 「HNOI2019」JOJO—— kmp自动机+主席树
题目:https://loj.ac/problem/3055 先写了暴力.本来想的是 n<=300 的那个在树上暴力维护好整个字符串, x=1 的那个用主席树维护好字符串和 nxt 数组.但 x ...
- [NOI2014][bzoj3670] 动物园 [kmp+next数组应用]
题面 传送门 思路 首先,这题最好的一个地方,在于它给出的关于$next$的讲解实在是妙极......甚至可以说我的kmp是过了这道题以后才脱胎换骨的 然后是正文: 如何求$num$数组? 这道题的输 ...
- LOJ#2249 Luogu P2305「NOI2014」购票
几乎肝了半个下午和整个晚上 斜率优化的模型好多啊... LOJ #2249 Luogu P2305 题意 给定一棵树,第$ i$个点如果离某个祖先$ x$的距离不超过$ L_i$,可以花费$ P_i· ...
随机推荐
- Mysql 免安装教程 百度云网盘有文件和word说明
一 把文件解压到一个目录下 这是解压后的目录 将my.ini文件考进去 双击打开my.ini 找到这两行更改成自己的解压路径保存 右键此电脑属性 找到高级系统设置配置环境变量 新建—>变量值是解 ...
- python文件操作【目录大全】
总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...
- 实时聊天-websocket与ajax的区别于联系
Ajax是什么? Ajax,即异步JavaScript和XML,是一种创建交互式网页应用的网页开发技术.通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整 ...
- Dubbo 一些你不一定知道但是很好用的功能
dubbo功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能: 直连Provider 在开发及测试环境下,可能需要绕过注册中心,只测试指定服务提供者,这时候可能需要 ...
- LeetCode 202: 快乐数 Happy Number
题目: 编写一个算法来判断一个数是不是 "快乐数". 一个 "快乐数" 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直 ...
- MySQL数字类型学习笔记
数字类型 最近在看<MySQL技术内幕:SQL编程>并做了笔记,所以本博客是一篇笔记类型博客,分享出来方便自己复习,也可以帮助他人 整型 类型 占用空间 最小值(SIGNED) 最大值(S ...
- java线程join方法使用方法简介
本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 public class ThreadTest { ...
- Mybatis技术内幕(一)——整体架构概览
Mybatis技术内幕(一)--整体架构概览 Mybatis的整体架构分为三层,分别是基础支持层.核心处理层和接口层. 如图所示: 一.基础支持层 基础支持层包含整个Mybatis的基础模块,这些模块 ...
- 跟着高淇学Python——第一到第三章总结
2019/10/26 第一章:Python介绍 Python是一种解释型,面向对象的语言.特点是: 可读性强 简洁,简洁 面向对象 免费开源 可移植性和跨平台性 丰富的库 可扩展性 应用范围:1.人工 ...
- Java开发桌面程序学习(四)——常用应用布局模板和简单分析
布局 前言 刚开始的时候,不知道使用什么布局,发现SceneBuilder其实有8.5版本的,里面就是有提供一个简单的桌面程序模板,8.5可以去官网下载,不过网速好像有点慢,慢慢等吧,官网下载地址 布 ...