题目链接

洛谷链接

我们发现题目要我们求的num[i]东西本质上其实是

求有多少以i结尾的非前缀且能与前缀匹配的字符串,而且要求字符串长度小于(i/2)

我们先不考虑字符串长度的限制,看所有以i结尾的非前缀且能与前缀匹配的字符串如何计数

考虑到KMP算法的next数组求解的过程,大家应该都想到i结尾的非前缀且能与前缀匹配的字符串的总数就是next[i]跳到0的所跳的次数

为什么是这样的呢?

如上图所示,其中绿色的串与红色的串是匹配的,若还要寻找匹配的串

不难发现所有以红色结尾处结尾所能匹配的串都是满足要求的

从上面的图不难发现以上结论是对的

具体求解时,我们先求一遍next数组,若next[i]为0,则不存在这样的字符串,如果大于0,则令num[i]=dep[next[i]]+1

但是我们还要考虑长度小于i/2这一个限制

一个朴素的想法就是next不停跳知道小于i/2为止,但这样复杂度是nlogn,TLE

所以我们要在做一遍魔改版KMP,求的是i结尾的非前缀且能与前缀匹配而且长度小于i/2的最长字符串

num[i]=dep[next2[i]]+1

魔改版KMP的求解过程与KMP类似,只是加了一句while(next[j]>i/2) j=next[j]

附上代码

# include<iostream>
# include<algorithm>
# include<cstring>
# include<cmath>
# include<cstdio>
const int mod = 1e9 + ;
const int mn = ;
int n,ans,N;
char s[mn];
int nxt[mn],dep[mn];
int main()
{
int tmp;
scanf("%d",&n);
while(n--)
{
ans=;
scanf("%s",s+);
N=strlen(s+);
nxt[]=;
dep[]=,dep[]=;
for(int i=,j=;i<=N;i++)
{
while(j> && s[i]!=s[j+]) j=nxt[j];
if(s[i]==s[j+]) j++;
nxt[i]=j;
dep[i]=dep[j]+;
}
/*for(int i=1;i<=N;i++)
printf("%d ",nxt[i]);*/
for(int i=,j=;i<=N;i++)
{
while(j> && s[i]!=s[j+]) j=nxt[j];
if(s[i]==s[j+]) j++;
while(j>i/) j=nxt[j];
ans=1ll*ans*(dep[j]+)%mod;
}
printf("%d\n",ans);
}
return ;
}

洛谷2375 BZOJ 3670动物园题解的更多相关文章

  1. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  2. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  3. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  4. BZOJ1878 洛谷1972 HH的项链题解

    洛谷链接 BZOJ链接 看到这样不用修改的题目,应该佷容易就联想到了离线来处理. 我们发现若将询问按照r来排序,排完后每次对答案有贡献的仅是每个颜色最后出现的位置 我们用next[i]表示i处颜色之前 ...

  5. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

  6. BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  7. 洛谷 P3332 BZOJ 3110 [ZJOI2013]K大数查询

    题目链接 洛谷 bzoj 题解 整体二分 Code #include<bits/stdc++.h> #define LL long long #define RG register usi ...

  8. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

  9. 洛谷10月月赛II题解

    [咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...

随机推荐

  1. Java 函数优雅之道

    导读 随着软件项目代码的日积月累,系统维护成本变得越来越高,是所有软件团队面临的共同问题.持续地优化代码,提高代码的质量,是提升系统生命力的有效手段之一.软件系统思维有句话“Less coding, ...

  2. 使用nodejs安装http-server

    一.下载nodejs(https://nodejs.org/) 二.在环境变量中配置nodejs路径: path: D:\Program\nodejs\ 三.打开终端: 使用node -v测试node ...

  3. 用CSS添加选中文字的背景色

  4. Python服务端工程师就业面试指导

    Python服务端工程师就业面试指导 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候 ...

  5. oracle习题集-高级查询2

    1.列出员工表中每个部门的员工数和部门编号 Select deptno,count(*) from emp group by deptno; 2.列出员工表中,员工人数大于3的部门编号和员工人数 ; ...

  6. oracle习题-emp表查询练习

    emp表查询练习 1 查询emp表的全部记录 Select * from emp; 2 查询出每个雇员的编号.姓名.基本工资 Select empno,ename,sal from emp; 3 查询 ...

  7. sar网络统计数据

    sar是一个研究磁盘I/O的优秀工具.以下是sar磁盘I/O输出的一个示例. 第一行-d显示磁盘I/O信息,5 2选项是间隔和迭代,就像sar数据收集器那样.表3-3列出了字段和说明. 表3-3    ...

  8. 洛谷P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler

    P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler 题目描述 Farmer John has purchased the world's most l ...

  9. TP3.2.x判断手机端访问并设置默认访问模块的方法 - ThinkPHP框架

    手机端访问时调用Wap手机模块,实现在手机端访问时展示出手机网站,无需跳转域名首先我们在./Application/Common/Conf/ 目录下建立两个公共配置文件:config.php 和con ...

  10. JZOJ 5455 拆网线

    Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现 ...