题目链接:

题目.

简单一点来说,这个题就是求一个字符串的\(num\)数组的和,其中有\(num[i]\)表示1~i中有多少个不交叉的相等的前缀和后缀 的数目,要求一个\(O(n)\)的做法

QwQ

感觉一看到这个题,其实没什么思路呀

从\(KMP\)的角度出发,对于一个\(i\)来说,显然\(pre[i],pre[pre[i]]\)都是他的后缀,所以,我们貌似可以维护一个\(num1\)表示,可以交叉的 相等的 前缀和后缀的数目

比较容易推出\(num1[i]=num1[pre[i]]+1\)

这里可以理解成 在原来最多的数目上,再加上当前位匹配的贡献

因为你对于当前的i的一些前后缀的比较和计算,已经在\(pre[i]\)的时候计算过了

那么我们怎么计算这个题目要求的\(num\)呢

QwQ实际上对于每个\(i\)要找到一个小于\(\frac{i}{2}\)的最小递归层数的\(pre\) (递归的意思是\(pre[pre[pre[i]]]\))

如果我们对于每一个\(i\)都暴力去做的话,时间复杂度肯定是不允许的,这时候我们就需要考虑一个性质:

我们在循环到\(i\)时当前的\(j\)是不是可以重前一次的最长的不重叠的\(j\)得到呢?答案是肯定的,要么小于等于上一次的\(j\),要么等于上一次的\(j+1\)

具体证明可以通过反证法来证明

QwQ然后就直接像\(KMP\)那种跳的方式,跳\(j\)就可以的

感觉这个题很有意思QwQ而且我还不是很懂呀

留个坑吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath> using namespace std; inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
} const long long mod = 1e9+7;
const int maxn = 1e6+1e2; int pre[maxn],num[maxn];
char s[maxn];
char s1[maxn];
long long ans=0;
int n;
int t; void init()
{
for (int i=1;i<=maxn-10;i++) s[i]=s1[i];
memset(pre,0,sizeof(pre));
ans=1;
memset(num,0,sizeof(num));
} int main()
{
cin>>t;
while (t--)
{
init();
scanf("%s",s+1);
n=strlen(s+1);
pre[1]=0;
num[1]=1;
for (int i=2;i<=n;i++)
{
int j=pre[i-1];
while (j && s[j+1] !=s[i]) j=pre[j];
if (s[j+1]==s[i]) j++;
pre[i]=j;
num[i]=num[j]+1;
}
int j=0;
for (int i=1;i<=n;i++)
{
while (j && s[j+1] !=s[i]) j=pre[j];
if (s[j+1]==s[i]) j++;
while ((j << 1)>=i+1) j=pre[j];
ans=ans*(num[j]+1)%mod;
}
cout<<ans<<endl;
}
return 0;
}

洛谷2375 NOI2014动物园(KMP)的更多相关文章

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

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

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

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

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

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

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

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

  5. 洛谷 P2375 [NOI2014]动物园

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

  6. 洛谷2375 BZOJ 3670动物园题解

    题目链接 洛谷链接 我们发现题目要我们求的num[i]东西本质上其实是 求有多少以i结尾的非前缀且能与前缀匹配的字符串,而且要求字符串长度小于(i/2) 我们先不考虑字符串长度的限制,看所有以i结尾的 ...

  7. BZOJ3670 & 洛谷2375 & UOJ5:[NOI2014]动物园——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3670 https://www.luogu.org/problemnew/show/P2375#su ...

  8. BZOJ3670:[NOI2014]动物园(KMP)

    Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习 ...

  9. BZOJ 3670: [Noi2014]动物园 [KMP]

    求这玩意: 对于字符串S的前i个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i] 对1,000,000,007取模的结果 n≤5,L≤1,00 ...

随机推荐

  1. mysql 8.0 1405的坑

    因版本差异:password  可能对应:authentication_string字段 不行的话再尝试一下,并且修改下密码类型 ALTER USER 'root'@'%' IDENTIFIED WI ...

  2. Linux 单实例oracle安装步骤

    一.查看逻辑盘大小,执行 lsblk 二.查看硬盘及分区信息 ,执行 fdisk -l 三.将物理硬盘分区初始化为物理卷,以便LVM使用 ,创建pv pvcreate /dev/sdb 四.查看物理卷 ...

  3. GoLang设计模式01 - 建造者模式

    建造者模式是一种创建型模式,主要用来创建比较复杂的对象. 建造者模式的使用场景: 建造者模式通常适用于有多个构造器参数或者需要较多构建步骤的场景.使用建造者模式可以精简构造器参数的数量,让构建过程更有 ...

  4. GoLang设计模式02 - 工厂模式

    工厂模式是一种创建型模式,也是最常用的设计模式之一.调用方通过工厂产出并获取对象,可以不必关注对象创建的细节和构建逻辑. 在工厂模式下,调用方只和工厂进行交互,并告诉工厂具体获取哪种类型的对象.工厂负 ...

  5. mybaits源码分析--binding模块(五)

    一.binding模块 接下来我们看看在org.apache.ibatis.binding包下提供的Binding模块 ,binding其实在执行sqlSession.getMapper(UserMa ...

  6. 如何在RHEL7或CentOS 7系统下修改网卡名称(亲测有效~!)

    亲测有效的更改RHEL7或CentOS 7的网卡名称的方法, 按照以下4步来操作就可以实现! Step 1 :网卡配置文件名称重命名为eth0[root@localhost ~]# ifconfige ...

  7. docker镜像与容器的导出导入

    导入导出涉及的命令有save.load.export.import # 1) docker save 导出镜像到文件 docker save -o nginx.tar nginx:latest # 2 ...

  8. [第六篇]——云服务器之Spring Cloud直播商城 b2b2c电子商务技术总结

    云服务器 云服务器(Elastic Compute Service, ECS)是一种简单高效.安全可靠.处理能力可弹性伸缩的计算服务. 云服务器管理方式比物理服务器更简单高效,我们无需提前购买昂贵的硬 ...

  9. DP 习题

    一.简单基础dp 这类dp主要是一些状态比较容易表示,转移方程比较好想,问题比较基本常见的.主要包括递推.背包.LIS(最长递增序列),LCS(最长公共子序列),下面针对这几种类型,推荐一下比较好的学 ...

  10. Elasticsearch(ES)的高级搜索(DSL搜索)(上篇)

    1. 概述 之前聊了一下 Elasticsearch(ES)的基本使用,今天我们聊聊 Elasticsearch(ES)的高级搜索(DSL搜索),由于DSL搜索内容比较多,因此分为两篇文章完成. 2. ...