\(problem\)

其中,\(next[i],next[next[i]],next[next[next[i]]]......\)都是这个前缀串i的公共前后缀,而且只有它们是公共前后缀

那么,我们其实只要在求\(next\)的过程中,顺便把这个公共前后缀的数量递推一下,就得到了一个弱化版的\(num数组\):可以重叠的公共前后缀数量,我们称之为\(ans\) 如何去除有重叠的?

还是看上面那张图

首先next数组有一个性质:\(next[i] < inext[i]<i\)

也就是说,一旦有一个递归了\(n\)层的\(next\),比原前缀i的长度的一半要小,那么这个\(next\)的递推出的答案\(ans\)就是\(i\)的\(num\)了

一个问题

假如我们拿到的串是\(1e6个'a'\),那么上面那个算法就会被卡成O(\(n^2\))道理的话大家可以想一想(每一次递归都只会把\(next[i]\)变小1)

那么我们需要做一个优化,来解决这个问题,而解决问题的核心就是:\(减少重复递归\)

减少重复递归......\(有没有想到什么?\)

没错,就是如同求\(next\)时一样的方法!

我们将递归用的变量\(j\)的值不更新,这样,求完了i的答案以后,\(j\)的位置一定在\(i/2\)的左边,也就是它已经满足要求了

这时再递归求解,总时间效率是\(O(n)\)的

#include <bits/stdc++.h>
using namespace std;
const ll MOD=1e9+7;
int n,fail[1000010],ans[1000010];
ll cnt;
char a[1000010];
int main() {
int T,i,j;
scanf("%d",&T);
while(T--) {
scanf("%s",a);
n=strlen(a);
memset(fail,0,sizeof(fail));
j=0;
ans[0]=0;
ans[1]=1;
for(i=1; i<n; i++) {
while(j&&(a[i]!=a[j])) j=fail[j];
j+=(a[i]==a[j]);
fail[i+1]=j;
ans[i+1]=ans[j]+1;
}
j=0;
cnt=1;
for(i=1; i<n; i++) {
while(j&&(a[i]!=a[j])) j=fail[j];
j+=(a[i]==a[j]);
while((j<<1)>(i+1)) j=fail[j];
cnt=(cnt*(ll)(ans[j]+1))%MOD;
}
printf("%lld\n",cnt);
}
return 0 ;
}

随机推荐

  1. Python supprocess模块

    当我们需要调用系统的命令的时候,最先考虑的os模块.用os.system()和os.popen()来进行操作.但是这两个命令过于简单,不能完成一些复杂的操作,如给运行的命令提供输入或者读取命令的输出, ...

  2. STM32 内存管理实验

    参考原文<STM32F1开发指南> 内存管理简介 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.最主要的目的是如何高效.快速的分配,并且在适当的时候释放和回收内存资源.内存管 ...

  3. PAT 1134 Vertex Cover

    A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at le ...

  4. Android layer-list(1)

     Android layer-list(1) Android layer-list,顾名思义,实现列表组合后形成的图层,写一个例子. activity_main.xml文件: <?xml v ...

  5. [bzoj2440]完全平方数[中山市选2011][莫比乌斯函数][线性筛][二分答案]

    题意:求第k个分解质因子后质因子次数均为一的数,即求第k个无平方因子数. 题解: 首先二分答案mid,那么现在就是要求出mid以内的无平方因子数的个数. 其次枚举$\sqrt{mid}$内的所有质数, ...

  6. 选择数字(codevs 3327)

    题目描述 Description 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入描述 Input De ...

  7. Jeecg+fixflow,工作流框架分享

    工作流引擎使用fixflow. 动态表达使用jeecg. 不多说直接上源码. 注:本人使用的jdk为6.0.mysql.tomcat6.0 其中fixflow-expand 为eclips流程设计核心 ...

  8. [bzoj 1093][ZJOI2007]最大半联通子图(强联通缩点+DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093 分析: 首先肯定是先把强联通全部缩成一个点,然后成了一个DAG 下面要知道一点: ...

  9. 在Spring MVC和Spring Boot中使用thymeleaf模板

    Spring MVC: POM: <!-- thymeleaf模板 --> <!-- https://mvnrepository.com/artifact/org.thymeleaf ...

  10. Fedora下克隆Octopress博客

    我在自己的github上搭建了一个Octopress博客(http://songlee24.github.io/),用于不定期的写一些学习笔记和心得体会.但是有时候由于换了电脑或者重装了linux系统 ...