2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)

https://www.luogu.com.cn/problem/P2375

题意:

PS:这道神题的背景让人疑惑,重点是当我飞快磨磨唧唧打出正确自认为正确的代码时,我第三个样例算出了144。讨论区一看,背景有大大的锅,哭了。

有n个字符串,对每个字符串S,设 num[i] 为 \(1 \dots i\) 的不重叠的相同的前缀和后缀的数量

例如: abcababcnum 数组为 \(0,0,0,1,1,1,1,1\) 。

分析:

EXKMP求的是前缀与后缀的最长公共前缀。求出z数组后(我是从0开始求z数组的),对于第 i 位(此时从1开始计算),它所对应的z数组 z[i] 正好是从 i 位(从第0位开始计数的话)开始的后缀与从第0位开始的前缀的最长公共前缀。设 \(x=min(i,z[i])\) , x 表示从第1位开始计数的第 i 位的长度为 i ,和从第0位开始计数的第 i 位的 z[i] 的长度的最小值。如: aaaaa 的z函数为

\[z_0=5,z_1=4,z_2=3,z_3=2,z_4=1
\]

i=1 时,z[1]=4 ,表示后四个a与整个字符串共同前缀最长为4,此时 \(x=min(1,4)=1\) ,表示第 i+x=2 位的 num[2] 增加1。根据题意,前缀与后缀不能重叠,所以最短的才是第 i+x 位的一个不重叠的公共的前缀与后缀的前缀。

当算出来第 i+x 位的 num 增加1时,根据z函数的定义,第 \(i+1 \dots i+x\) 位的 num 都增加了1。

例如: abcdabci=4 时,z[4]=3 , \(x=min(4,3)=3\) ,求出来的是对第 i+x=4+3=7 位的 num 加1,但是同时我们也算出来了对 i+x-1=4+2=6i+1=4+1=5num 加1。

当我开心的写个了for循环搞定这一坨东西后,我发现,我“开心”地TLE了,只有可怜的50分,硬生生写了个kmp也有60分啊……

开始优化:差分是个好东西,把原来最差循环时间复杂度为 \(O(n/2)\) 的立马变为一加一减。

OK,恭喜你,AC这道我第一次见的时候还是紫题的蓝题。

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int N=1e6+10;
const int mod=1e9+7;
typedef long long ll;
int n,z[N],nexti[N];
char s[N]; inline void getz(char *s){
int len=strlen(s);
z[0]=len;
for(int i=1,l=0,r=0;i<len;i++){
if(i<=r)z[i]=min(z[i-l+1-1],r-i+1);
while(i+z[i]<len&&s[z[i]-1+1]==s[i+z[i]-1+1])++z[i];
if(i+z[i]-1>r)l=i,r=i+z[i]-1;
}
//for(int i=0;i<=len;i++)cout<<z[i]<<" ";cout<<endl;
} int main(){
cin>>n;
while(n--){
memset(z,0,sizeof(z));
memset(nexti,0,sizeof(nexti));
scanf("%s",s);
getz(s);
int len=strlen(s);
for(int i=1;i<=len;i++){
int x=min(z[i],i);
++nexti[i+1];--nexti[i+x+1];
//for(int j=i+x;j>i;j--)++nexti[j];
}
//for(int i=len-1;i>=1;i--)nexti[i]=max(nexti[i+1]-1,nexti[i]);
ll ans=(nexti[1]+nexti[0]+1);
for(int i=2;i<=len;i++)nexti[i]+=nexti[i-1],ans=ans*(nexti[i]+1)%mod;
//for(int i=1;i<=len;i++)cout<<nexti[i]<<" ";cout<<endl;
cout<<ans<<endl;
}
return 0;
}

2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)的更多相关文章

  1. 洛谷 P2375 [NOI2014]动物园 解题报告

    P2375 [NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定 ...

  2. 2021.08.16 P1260 工程规划(差分约束)

    2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...

  3. [洛谷P2375] [NOI2014]动物园

    洛谷题目链接:[NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决 ...

  4. 【题解】洛谷P2375 [NOI2014] 动物园(KMP)

    洛谷P2375:https://www.luogu.org/problemnew/show/P2375 思路 这道题可以说是完全刷新了本蒟蒻对KMP的理解 感觉对next数组的理解上升到一个新的高度 ...

  5. 【KMP】洛谷P2375 [NOI2014]动物园 题解

        一开始的方向应该对了,但是没有想到合理的优化还是没写出来…… 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己 ...

  6. P2375 [NOI2014]动物园

    考虑kmp. 这个题的主要问题就在于怎样使复杂度是正确的O(n). 可以先预处理一个数组cnt[]表示不考虑不能相交这个限制,有多少个border. 这个东西其实也就是fail树上的深度. 然后考虑怎 ...

  7. P2375 [NOI2014]动物园 KMP

    好,暴力能拿$50pts\space qwq$ 暴力的思路就是一直跳$nxt[j]$,直到它的长度小于串的一半,然后开始计数,当然要接着跳$nxt[j]$ 正解:考虑没有长度要求的(不要求不重合)公共 ...

  8. 洛谷 P2375 [NOI2014]动物园

    题目传送门 解题思路: 其实对于一个sum[i],其值就等于sum[next[i]] + sum[next[next[i]]] + ... + 1,然后我们可以记忆化,然后题目里又有一个限制,就是前后 ...

  9. 日常Java 2021/11/16

    获得applet参数 下面的例子演示了如何使用一个Applet响应来设置文件中指定的参数.该Applet显示了-个黑色棋盘图案和第二种颜色.第二种颜色和每一列的大小通过文档中的Applet的参数指定. ...

随机推荐

  1. MySQL二进制binlog日志说明以及利用binlog日志恢复数据

    MySQL的binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全量备份+binlog日志恢复增量数据部分). 一.关于 ...

  2. Serialzers 序列化组件

    Serialzers 序列化组件 前言 当做前后端分离的项目时,JSON是一个轻量级的数据交互格式.所有我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到数据进行序列化 Django ...

  3. 内网渗透----使用mimikatz获取windows登陆口令

    使用mimikatz提取windows密码 以管理员运行后,可以随机打一些字符,进入如下界面 输入aaa::aaa,可展示所有模块: 可采用log命令,保存日志 获取hash与明文用户口令 privi ...

  4. 计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信

    所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制.从所处的地位来讲,套接字上联应 ...

  5. kafka 学习(二--前言)

    kafka 现在在企业应用和互联网项目中的应用越来越多了,本篇文章就从 kafka 的基础开始带你一展 kafka 的宏图 1. 什么是 Kafka Kafka 是一个分布式流式平台,它有三个关键能力 ...

  6. mq 的缺点?

    (1)系统可用性降低 系统引入的外部依赖越多,越容易挂掉,本来你就是 A 系统调用 BCD 三个系统的接口就好了,人 ABCD 四个系统好好的,没啥问题,你偏加个 MQ 进来,万一MQ 挂了咋整?MQ ...

  7. java-設計模式-原型模式

    原型模式 是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类. 問題: 如果我們要複製一個類實例: 首先, 你必须新建一个属于相同类的对象. 然后, 你必须遍历原始对象的所 ...

  8. sp-MVC-ideabaok

    直接通过初始化器创建 或者通过创建maven工程在自己添加需要的东西 配置 dispatcher-servlet.xml 包括扫描加载包: <context:component-scan bas ...

  9. HTML5 Performance

    简介 performance是html5的新特性之一,通过它,页面的开发者们可以非常精确的统计到自己页面的表现情况,从而有针对性的进行优化,提升用户体验. 下面是小姐姐对performance相关AP ...

  10. pip freeze > requirements.txt` 命令输出文件中出现文件路径而非版本号

    pip freeze > requirements.txt 命令输出文件中出现文件路径而非版本号 解决办法: pip list --format=freeze > requirements ...