题目意思是给你一个字符串,f[x]是长度为x的子串中,出现个数最多的那个串的出现次数。

给出原串,依次输出f[1],f[2],……。

后缀自动机。对于某一个状态,right[]值的大小就是出现的次数,而且是对于长为step[]的子串的出现次数。

因为小于step值的串在前面已经加了,在pre指针线上面的状态要把当前数量累加上去即可。

不过注意这里要先拓扑排序,这样才能保证更新的正确性。恩,很实用很不错的一种拓扑排序方式。新技能get。

召唤代码君:

#include <iostream>
#include <cstdio>
#define maxn 500500
using namespace std; int next[maxn][26],pre[maxn],step[maxn],dp[maxn],g[maxn],Q[maxn],cnt[maxn];
int N,last,p,q,np,nq;
char s[maxn]; void insert(int x,int m)
{
p=last,np=++N,step[np]=m,last=np,g[np]++;
while (p!=-1 && next[p][x]==0)
next[p][x]=np,p=pre[p];
if (p==-1) return ;
q=next[p][x];
if (step[q]==step[p]+1)
{ pre[np]=q; return; }
nq=++N,step[nq]=step[p]+1,pre[nq]=pre[q];
for (int i=0; i<26; i++)
next[nq][i]=next[q][i];
  pre[np]=pre[q]=nq;
while (p!=-1 && next[p][x]==q)
next[p][x]=nq,p=pre[p];
} int main()
{
pre[0]=-1;
scanf("%s",s);
for (int i=0; s[i]; i++) insert(s[i]-'a',i+1);
for (int i=1; i<=N; i++) cnt[step[i]]++;
for (int i=1; i<=N; i++) cnt[i]+=cnt[i-1];
for (int i=1; i<=N; i++) Q[cnt[step[i]]--]=i;
for (int i=N; i>=1; i--) dp[step[Q[i]]]=max(dp[step[Q[i]]],g[Q[i]]),g[pre[Q[i]]]+=g[Q[i]];
for (int i=1; s[i-1]; i++) printf("%d\n",dp[i]);
return 0;
}

  

SPOJ_NSUBSTR的更多相关文章

随机推荐

  1. Error:(1, 1) java: 非法字符: ‘\ufeff’

    一.问题 用IDEA打开eclipse java项目编译时,出现以下错误: Error:(1, 1) java: 非法字符: '\ufeff' Error:(1, 10) java: 需要class, ...

  2. SSIS 变量、参数和表达式

    动态包对象包括变量,参数和表达式.变量主要为包提供一种对象之间相互通信的方法,变量的值是可以更新的.而参数不同于变量,参数的值在包中是不能修改的,只能通过外部来设置参数.表达式可以引用变量.参数.常量 ...

  3. 为什么Python类成员的调用和声明必须有"this"?

    Python的这种设计是作者从Modula-3中借鉴来的,在后面使用的情况看来,这个设计也是比较成功的.我们对比Python和C++讨论一下这个问题: Modula-3是上世纪80年代末数字设备公司( ...

  4. stringObject.substring(start,stop)

    用于提取字符串中 介于两个指定下标之间的字符. start 必需.一个非负的整数 stop 可选.一个非负的整数

  5. python代码异常范围检查方法(非常实用)

    对于python编程的代码,如果需要进行相应的检查其中的错误或者异常,并且确定出现异常语句的大致范围,主要有以下四种方法: 1.第一种方法:遇错即止(告知原因) try  ......(所需检查语句) ...

  6. k8s踩坑记第1篇--rc无法创建

    六一快乐!!! 什么是k8s,我不想解释,百度资料有很多,本系列只踩坑,不科普. 问题描述: 做Hello World的例子,结果get pods一直显示没有资源? 应用配置代码: apiVersio ...

  7. python基础知识-12-模块的了解

    python其他知识目录 1.模块介绍: Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句.模块让你能够有逻辑地组织你 ...

  8. java内存结构JVM——java内存模型JMM——java对象模型JOM

    JVM内存结构 Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存在,而有些区 ...

  9. java工程文件路径的问题

    String classpath = this.getClass().getResource("/").getPath().replaceFirst("/WEB-INF/ ...

  10. Currency Exchange 货币兑换 Bellman-Ford SPFA 判正权回路

    Description Several currency exchange points are working in our city. Let us suppose that each point ...