LG2375 [NOI2014]动物园
动物园
给定一个长为\(L\)的字符串(\(L \leq 1e6\))
求一个\(num\)数组,\(num[i]\)表示长度为\(i\)的前缀中字符串\(S’\)的数量,其中\(S‘\)既是该前缀的前缀也是该前缀的后缀,且\(2|S'| \leq i\)
分析
用kmp算法,\(num[i]\)其实就是\(i\)在\(f\)中跳,值小于\(i/2\)的个数。然而直接这样求是\(O(n^2)\)的,因为可以造一个全a串,然后\(f\)都是前一个\(f\)加\(1\).
kmp的精髓是继承,那这道题可否继承?显然可以。
对于\(i\)位置满足条件的\(S’\),\(i+1\)位置满足条件的\(S’’\)其实是在S’的基础上至多多了一个字符。
先求出不加限制的\(num\)数组,注意到对于\(i\)它的\(num\)至少为\(1\)因为要考虑它本身。然后\(num[0]\)要赋成0,因为后面计算的时候转移到0肯定是无法匹配,值应该为\(1\),并且\(num[0]\)是肯定不会算入答案的。然后求答案时维护\(j\)不超过\(i\)的一半就行了。
时间复杂度\(O(n)\)。
har s[1000010];
int f[1000010];
int num[1000010];
int main()
{
int T;
read(T);
while(T--)
{
scanf("%s",s);
int n=strlen(s);
f[0]=0,f[1]=0;
num[0]=0,num[1]=1; // 不加限制的num数组
int j=0;
for(int i=1;i<=n;++i)
{
while(j&&s[i]!=s[j])
j=f[j];
j+=(s[i]==s[j]);
f[i+1]=j,num[i+1]=num[j]+1; // 值要加1是因为它本身也要计算
}
j=0;
int ans=1;
for(int i=0;i<n;++i)
{
while(j&&s[i]!=s[j])
j=f[j];
j+=(s[i]==s[j]);
while((j<<1)>(i+1))
j=f[j];
ans=(ll)ans*(num[j]+1)%mod;
}
printf("%d\n",ans);
}
return 0;
}
Hint
其实我觉得这样写虽然很简洁,但是细节较多,不推荐。推荐另一种倍增的写法,把fail数组加一个倍增,这样更直观,但是时间复杂度\(O(n\log n)\).
LG2375 [NOI2014]动物园的更多相关文章
- [BZOJ3670][UOJ#5][NOI2014]动物园
[BZOJ3670][UOJ#5][NOI2014]动物园 试题描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学 ...
- NOI2014 动物园
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 174 Solved: 92[Submit][Status] D ...
- 字符串(KMP):BZOJ 3670 [Noi2014]动物园
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1521 Solved: 813[Submit][Status] ...
- BZOJ 3670: [Noi2014]动物园【KMP变形 】
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2738 Solved: 1475[Submit][Status ...
- BZOJ_3670_[Noi2014]动物园_KMP
BZOJ_3670_[Noi2014]动物园_KMP Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的 ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
- BZOJ3670 [Noi2014]动物园 【KMP计数】
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 3143 Solved: 1690 [Submit][Stat ...
- [洛谷P2375] [NOI2014]动物园
洛谷题目链接:[NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决 ...
- 【bzoj3670】[Noi2014]动物园
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2080 Solved: 1107[Submit][Status ...
随机推荐
- English trip -- Review Unit7 Shopping 购物
Xu言: 今天,lamb老师帮我梳理的时候到时提醒了我件事,之前Jade老师也说过每个单元的课程其实有个大主题,我需要把这个单元上完以后全部好好的回顾,然后整理一下.把每个单元的主题以及主题(them ...
- 1月4日编程基础hash
早上git加星了webapp的教程 > h = Hash.new('Go Fishing') => {} // 创建一个空hash,设定"Go Fishing&qu ...
- php表单提交安全方法
1.$_SERVER["PHP_SELF"] 将表单数据发送到页面本身,而不是跳转到另一张页面.这样,用户就能够在表单页面获得错误提示信息.2.通过使用 htmlspecialch ...
- 关于floyd 打印路径的问题
我们令 f[i][j] 表示从 i-->j的最短路上j前面的那个点. 显然初始化时 f[i][j]=i; (这样的话先判断一下i是否能到达j好点) 更新条件时,当发现通过点k能使最短 ...
- UVA-10118 Free Candies (DP、记忆化搜索)
题目大意:有4堆糖果,每堆有n个,有一只最多能容5个糖果的篮子.现在,要把糖果放到篮子里,如果篮子中有相同颜色的糖果,放的人就可以拿到自己的口袋.如果放的人足够聪明,问他最多能得到多少对糖果. 题目分 ...
- C#图片转换成二进制流并且保存到sql server数据库
注意:我要存储文件二进制流的列的类型是text,不是image类型. 我已经实现了从数据库中读取text类型的二进制流,,现在就是不知道怎么存进去. 我的部分关键代码: StreamReader sr ...
- div在IE6中固定
在IE6中固定一div在右下角,但是ie6不支持position:fixed属性,那么只能通过js实现,通过js判断浏览器在ie6的情况下,div的position为absoluate:right:0 ...
- SQL Server 调优系列基础篇 - 联合运算符总
前言 上两篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符的优化技巧,本篇我们总结联合运算符的使用方式和优化技巧. 废话少说,直接进入本篇的主题. 技术准备 基于SQL Server200 ...
- 《Python》 函数嵌套、闭包和迭代器
一.函数的嵌套: 1.函数的嵌套调用 def max2(x,y): m = x if x>y else y return m def max4(a,b,c,d): res1 = max2(a,b ...
- Android系统移植与驱动开发
21世纪,Android发展非常迅速,在市场上占有很大的比例,遥遥领先与iOS,很大程度上是因为任何人都可以利用Android的源代码定制完全属于自己的嵌入式开发系统,而不需要向Google交一分钱. ...