洛谷2375 BZOJ 3670动物园题解
我们发现题目要我们求的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动物园题解的更多相关文章
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- BZOJ1878 洛谷1972 HH的项链题解
洛谷链接 BZOJ链接 看到这样不用修改的题目,应该佷容易就联想到了离线来处理. 我们发现若将询问按照r来排序,排完后每次对答案有贡献的仅是每个颜色最后出现的位置 我们用next[i]表示i处颜色之前 ...
- 洛谷 P3307: bzoj 3202: [SDOI2013] 项链
题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...
- BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- 洛谷 P3332 BZOJ 3110 [ZJOI2013]K大数查询
题目链接 洛谷 bzoj 题解 整体二分 Code #include<bits/stdc++.h> #define LL long long #define RG register usi ...
- 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径
//bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
随机推荐
- MySQL 报错:Translating SQLException with SQL state '42000', error code '1064', message
MySQL报错详细日志 2019-09-12 16:42:29 [http-nio-80-exec-25] DEBUG [org.springframework.jdbc.support.SQLErr ...
- Leetcode109. Convert Sorted List to Binary Search Tree有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10 ...
- Linux User and Group Management
linux is a multi-user and multitasking OS. In Linux, you can create any number of user account and g ...
- Redis功能类
<?phpnamespace org; /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防 ...
- TZ_11_Spring-Boot的属性注入方式(jdbc为例)
1.以上一篇文档为基础 2.创建jdbc外部属性文件 application.properties此名字为默认文件名在使用是不需要使用 @Propertysource("classpath: ...
- HTML 页面间传值(包含中文)
A页面——>B页面 A页面 $('.edit-bottom').click(function () { var word1=$('#word').val();//需要传到B页面的值 var ur ...
- vue+ElementUI项目中,input只能输入正整数的验证
代码如下: <el-input v-model="famount" placeholder="请输入内容" @keyup.native=&q ...
- PhpSpreadsheet处理表格2
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- openpyxl 模块的使用
参考博客:https://www.cnblogs.com/anpengapple/p/6399304.html?utm_source=itdadao&utm_medium=referral 在 ...
- Codeforces 3D
题目链接 D. Least Cost Bracket Sequence time limit per test 1 second memory limit per test 64 megabytes ...