传送门1
传送门2
写在前面:难得题面和题解是一致的算法
思路:原始想法是先KMP建next数组,同时记录1-len每个长度的“公共前缀后缀”的总和sum[i],很容易想到sum[i]=1+sum[tmp]sum[i]=1+sum[tmp],tmp就是长度为i的字符串中是前缀同时是后缀的字符串的长度(就是那个用next[next[…求的东西),之后判断长度1-len的next[i],如果next<i/2,num[i]=sum[next[i]]num[i]=sum[next[i]],不然就令next[i]=next[next[i]],继续判断,直到符合条件为止。
这种最简单粗暴的方式可以过50分,但我们发现如果原串是一个循环字符串而且循环节特别小,例如“aaaaaaaaaaa…”,那么每次求num时,next[i]是一个字符一个字符往前蹦达的,那也就是说最坏情况下时间复杂度会达到O(len2)O(len^2),爆炸。(顺便说一下,蒟蒻就是被卡在这里好久,想到这个问题就头大,搞的忘记了next数组的性质,直接转移到next[i/2]上去了……竟然还能过样例)无法,蒟蒻选择看题解,发现题解的做法是把求next,sum放在一起,求答案(num)放在一起,开了两个循环,后来想了一下,求next,sum时tmp是从next[i]开始逐渐往后跳,时间复杂度均摊下来是O(len)O(len),而求答案时完全可以类似于从前往后走,每次求num时前进最多一格,后退不确定,但总的复杂度是一定的且可以接受的。
注意:答案用long long保存,sum[1]=1(它自身就是一个哦)

#include<bits/stdc++.h>
#define mod 1000000007
using 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);}
}

【BZOJ3670】【codevs3319】动物园,KMP+时间优化相关推荐

  1. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  2. Rust和C / C ++的跨语言链接时间优化LTO

    Rust和C / C ++的跨语言链接时间优化LTO 链接时间优化(LTO)是LLVM实施整个程序优化的方法.跨语言LTO是Rust编译器中的一项新功能,使LLVM的链接时间优化可以在混合的C / C ...

  3. android动态设置冷启动图片拉伸变形,Android冷启动时间优化

    冷启动时间是指当用户点击你的app那一刻到系统调用Activity.onCreate()之间的时间段.在这个时间段内,WindowManager会先加载app主题样式中的windowBackgroun ...

  4. Android系统优化(65)---MTK 平台开关机、重启时间优化

    开关机.重启时间优化   一.开关机.重启时间优化: 开机性能优化:是用功能和其它因素多方面平衡的结果,片面追求单方面的性能没有太大意义:有些产品设计开机动画非常酷炫,动画图片过多.高帧率会影响开机速 ...

  5. Android 系统性能优化(57)---MTK 平台开关机、重启时间优化

    MTK 平台开关机.重启时间优化  开关机.重启时间优化   开机性能优化:是用功能和其它因素多方面平衡的结果,片面追求单方面的性能没有太大意义:  有些产品设计开机动画非常酷炫,动画图片过多.高帧率 ...

  6. android 性能优化---(2) MTK 平台开机时间优化

    一.在工程模式开启MTKLogger, 开机后取日志bootprof  adb pull /storage/emulated/0/mtklog/mobilelog/APLog_2018_0309_10 ...

  7. Swift与Objective-C混编时,我们是如何将编译时间优化了35%?

    作者 | 赵志.曾庆隆.顾梦奇.王强.赵发 出品 | CSDN(ID:CSDNnews) 2019年3月25日,苹果发布了Swift 5.0版本,宣布了ABI稳定,并且Swift runtime和标准 ...

  8. 安卓系统开机时间优化分析

    Android 开机时间分析工具-----perfboot 安卓10开机时间优化分析 Android开机阶段log分析

  9. 安卓10开机时间优化分析

    本文从以下六点分析开机时间 1.软件环境2.开机时间测试方法3.开机各阶段重要的时间节点4.bootchart工具使用说明5.Android开机时间日志信息6.开机时间优化方案 一.软件环境 平台:a ...

最新文章

  1. SAP PM 初级系列18 - 为维修工单分配Permit
  2. Android stutdio2.2 启动模拟器出现“/dev/kvm is not found.”解决方法
  3. 描述linux目录结构以及目录结构命名规定
  4. Python学习系列day2-python基础
  5. tomcat自动运行磁盘任意位置上的项目、使用Maven对tomcat进行自动部署
  6. 将mysql的data目录移走方法
  7. @SpringBootApplication(exclude={DataSourceAutoConfiguration.class})注解作用
  8. Java别说取余( )运算简单,你真的会吗
  9. 【转】掌握Azure订阅的关键概念和术语
  10. 复制书稿(信息学奥赛一本通-T1278)
  11. 设计模式笔记八:过滤器模式
  12. mysql 表结构监控_性能测试之mysql监控、优化
  13. JSP页面添加播放视频功能
  14. 线性排序算法-堆排序 (2)
  15. Linux制作补丁与打补丁简单用法
  16. 职称计算机和英语有效性,2015职称计算机考试突破小诀窍
  17. 数据库的几种去重方法总结
  18. 万用表的灵活使用,不仅只有基本使用方法!
  19. 【安安教具】-【数学】-【一阶线性齐次方程】模拟器 教你如何用python制作一阶线性齐次方程模拟器 python项目小发明
  20. 杨海朝 mysql_老男孩Mysql高级DBA 实战新浪首席DBA 老男孩教育杨海朝老师全程主讲 老男孩Mysql视频...

热门文章

  1. 失去循环标记的Python,我这样实现跳出外层循环
  2. Cloud Native Weekly|2019欧洲KubeCon成功闭幕
  3. mysql设置用户永不过期_在Navicat Premium中管理MySQL用户 - 第2部分:创建新用户
  4. 二维声波方程的有限差分法数值模拟
  5. minianaconda安装图形化界面
  6. Jetson AGX Xavier配置PyTorch与TorchVision流程
  7. mysql教程排序_MySQL中的排序函数field()实例详解
  8. Word中如何正确添加参考文献
  9. cygwin安装教程图解
  10. java冒泡排序法对数组进行排序