【bzoj3670】: [Noi2014]动物园 字符串-kmp-倍增
一开始想的是按照kmp把fail算出来的同时就可以递推求出第i位要f次可以跳到-1
然后把从x=i开始顺着fail走,走到fail[x]*2<i 然后ans*=f[fail[x]]+1 就好了?
但是发现显然会变成O(n^2) TLE。。
于是就想到了倍增fail[i][j]就是第i位顺着fail 跳了 2^j 的位置
好像很对的样子就把O(nlogn)的交了一发好像还是TLE了。。
我可能需要W(卡)Y(常)S(数) 优化。。把fail[i][j] 换成 第j位顺着fail跳了2^i 次
似乎一下快了好多 然后4s AC了。。
/* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std; #define P 1000000007
int T,fail[][],num,f[],Fail[];
char s[];
long long ans; void work(){
scanf("%s",s+);
f[]=,Fail[]=-,ans=;
for (int i=;i<=;i++) fail[i][]=-;
for (int i=,l=strlen(s+);i<=l;i++){
Fail[i]=Fail[i-];
while (s[Fail[i]+]!=s[i] && Fail[i]!=-) Fail[i]=Fail[Fail[i]];
fail[][i]=++Fail[i];
for (int j=;j<=;j++) fail[j][i]= fail[j-][i]==- ? - : fail[j-][fail[j-][i]];
num=fail[][i];
for (int j=;j>=;j--) fail[j][num]*>i ? num=fail[j][num] : ;
if (num!= && num*>i) num=fail[][num];
f[i]=f[Fail[i]]+;
ans=(ans*(f[num]+))%P;
}
printf("%lld\n",ans);
} int main(){
scanf("%d\n",&T);
while (T--) work();
return ;
}
奇怪的倍增
然后发现正解是维护fail1和fail2。。fail1一个是原来的fail,fail2[x]是fail1[x]跳到fail[x]*2<i的结果
其实fail2可以跟着fail1一起递推,初始值换一下就好了。。
/* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std; #define P 1000000007
int T,fail[],num,f[],Fail[];
char s[];
long long ans; void work(){
scanf("%s",s+);
f[]=,Fail[]=fail[]=-,ans=;
for (int i=,l=strlen(s+);i<=l;i++){
Fail[i]=Fail[i-];
fail[i]=fail[i-];
while (s[Fail[i]+]!=s[i] && Fail[i]!=-) Fail[i]=Fail[Fail[i]];
while (s[fail[i]+]!=s[i] && fail[i]!=-) fail[i]=Fail[fail[i]];
++Fail[i];
++fail[i];
while (fail[i]*>i) fail[i]=Fail[fail[i]];
f[i]=f[Fail[i]]+;
ans=(ans*(f[fail[i]]+))%P;
}
printf("%lld\n",ans);
} int main(){
scanf("%d\n",&T);
while (T--) work();
return ;
}
正解
【bzoj3670】: [Noi2014]动物园 字符串-kmp-倍增的更多相关文章
- BZOJ3670 [Noi2014]动物园 【KMP计数】
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 3143 Solved: 1690 [Submit][Stat ...
- 【BZOJ3670】动物园(KMP算法)
[BZOJ3670]动物园(KMP算法) 题面 BZOJ 题解 神TM阅读理解题 看完题目之后 想暴力: 搞个倍增数组来跳\(next\) 每次暴跳\(next\) 复杂度\(O(Tnlogn)\) ...
- BZOJ 3670: [Noi2014]动物园【KMP变形 】
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2738 Solved: 1475[Submit][Status ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
- BZOJ3670:[NOI2014]动物园(KMP)
Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习 ...
- [BZOJ3670] [NOI2014] 动物园 解题报告 (KMP)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3670 Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅, ...
- [NOI2014]动物园(KMP,字符串)
半年前看这题还感觉很神仙,做不动(没看题解). 现在过来看发现……这tm就是一个sb题…… 首先题面已经提示我们用 KMP 了.那 KMP 究竟能干啥呢? 看 $num$ 的定义.发现对于前缀 $i$ ...
- bzoj3670 [Noi2014]动物园——KMP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3670 第一次写KMP算法...又T又WA了半天... 1. num 数组表示包括其本身的前缀 ...
- BZOJ3670 [Noi2014]动物园
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
随机推荐
- Nginx反向代理图片总结
配置需求: 内网192.168.80.205的机器上部署了一个Web项目,下文称web, url为http://192.168.80.205:8082. 并且使用nginx访问图片,url格式 ...
- Python 正则表达式之选择
In [4]: import re In [5]: re.findall(r"\d+","jjj1234mm222")Out[5]: ['1234', '222 ...
- svn锁定问题解决
问题描述: 今天遇到svn文件被某个人锁定,搞得全部人都不能提交更新. 解决方法一: 首先,先定位到工程目录下,然后使用如下命令查看是否有锁 find . | grep ".svn/lock ...
- DIKW模型与数据工程
DIKW 体系 DIKW体系是关于数据.信息.知识及智慧的体系,可以追溯至托马斯·斯特尔那斯·艾略特所写的诗--<岩石>.在首段,他写道:“我们在哪里丢失了知识中的智慧?又在哪里丢失了信息 ...
- CSS——优先级
转自:http://www.planabc.net/2008/05/06/css_specificity/ CSS2.1 中规定了关于 CSS 规则 Specificity(特异性)的计算方式,用一个 ...
- [转]C#开发微信公众平台-就这么简单
本文转自:http://www.it165.net/pro/html/201403/11102.html 写在前面 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文.菜单 ...
- .Net Core 迁移之坑一 《WebAPI Get请求参数传入输入带有[]不识别问题》
在Framwork 体系下 WebAPI项目 会有很多默认特性,例如:Get查询竟然支持三种数组查询方式 1.https://localhost:44390/api/values?status=1&a ...
- web界面上的字体兼容方案
原贴地址:http://www.baidufe.com/item/60cd11d3bfdee5c51369.html 做前端的,对web界面基本都抠的很仔细,尤其精确到1px! 类似边距.宽度.高度等 ...
- Vmware中的centos虚拟机克隆之后没有eth0
克隆虚拟机之后,CentOS没有eth0的解决办法 我们常常需要从一台已经安装完成的虚拟机系统克隆出来一个新系统(克隆时候必须要改变网卡物理地址,这一点无需多说),但是新系统启动之后,会发现系统网络工 ...
- 2、python的print函数格式化输出
1.格式化输出浮点数(float) pi = 3.141592653 print('%10.3f' % pi) #字段宽10,精度3 ,结果 print('%010.3f' % pi) #用0填充 ...