【BZOJ3670】【codevs3319】动物园,KMP+时间优化
来源:互联网 发布:单文件编程改多文件 编辑:程序博客网 时间:2024/04/29 17:29
传送门1
传送门2
写在前面:难得题面和题解是一致的算法
思路:原始想法是先KMP建next数组,同时记录1-len每个长度的“公共前缀后缀”的总和sum[i],很容易想到
这种最简单粗暴的方式可以过50分,但我们发现如果原串是一个循环字符串而且循环节特别小,例如“aaaaaaaaaaa…”,那么每次求num时,next[i]是一个字符一个字符往前蹦达的,那也就是说最坏情况下时间复杂度会达到
注意:答案用long long保存,sum[1]=1(它自身就是一个哦)
#include<bits/stdc++.h>#define mod 1000000007using namespace std;int tmp,T,len;int sum[1000010],next[1000010];long long ans;char s[1000010];main(){ sum[1]=1; scanf("%d",&T); while (T--) { scanf("%s",s); ans=1;tmp=0; for (int i=1;s[i];i++) { tmp=next[i]; while (tmp&&s[tmp]!=s[i]) tmp=next[tmp]; tmp+=(s[i]==s[tmp]); next[i+1]=tmp; sum[i+1]=sum[tmp]+1; } for (int i=1;s[i];i++) { while (tmp&&s[tmp]!=s[i]) tmp=next[tmp]; tmp+=(s[i]==s[tmp]); while (tmp>((i+1)>>1)) tmp=next[tmp]; ans=ans*(sum[tmp]+1)%mod; } printf("%lld\n",ans); }}
0 0
- 【BZOJ3670】【codevs3319】动物园,KMP+时间优化
- NOI2014 CodeVS3319 Bzoj3670 动物园
- bzoj3670: [Noi2014]动物园 KMP
- 【KMP】[Noi2014] bzoj3670 动物园
- [BZOJ3670][Noi2014]动物园 && KMP
- [BZOJ3670]NOI2014动物园|KMP
- bzoj3670 [Noi2014]动物园 kmp
- 【bzoj3670】[Noi2014]动物园 KMP
- 【bzoj3670】动物园 kmp
- bzoj3670 NOI2014 动物园 kmp
- BZOJ3670(Noi2014)[动物园]--KMP
- 【bzoj3670】【NOI2014】【动物园】【kmp+dp】
- bzoj3670 noi2014动物园(kmp)
- [BZOJ3670][Noi2014]动物园(KMP)
- 【BZOJ3670】【NOI 2014】动物园(KMP)
- BZOJ3670【NOI2014】动物园(KMP变形)
- [BZOJ3670][NOI2014]动物园(KMP)
- BZOJ3670 [Noi2014]动物园 【KMP计数】
- codeforces 484A bits
- Java——自定义注解
- 第五周项目1-三角形类雏形(4)
- BFS经典例题—迷宫问题
- 数据类型的转换
- 【BZOJ3670】【codevs3319】动物园,KMP+时间优化
- 线段树----区间极大值
- sockiopool
- CSS样式
- Java环境变量配置
- AVPlayer 的几个关键点
- POJ-2777 Count Color(线段树)
- 第五周上机实践项目 项目3--时间类(2)
- ytu 2614 A代码完善--系统日期