SPOJ_NSUBSTR
题目意思是给你一个字符串,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的更多相关文章
随机推荐
- Python爬虫入门 之 如何在豆瓣中获取自己喜欢的TOP N电影信息
什么是爬虫 按照一定规则自动的获取互联网上的信息(如何快速有效的利用互联网上的大量信息) 爬虫的应用 搜索引擎(Google.百度.Bing等搜索引擎,辅助人们检索信息) 股票软件(爬取股票数据,帮助 ...
- Jmeter接口测试(七)用例数据分离
之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...
- Siki_Unity_7-4_高自由度沙盘游戏地图生成_MineCraft_Uniblocks插件(可拓展)
Unity 7-4 高自由度沙盘游戏地图生成 MineCraft (插件Uniblocks) 任务1&2&3&4 素材 && 课程演示 && 课 ...
- 零基础学python之函数与模块(附详细的代码和安装发布文件过程)
代码重用——函数与模块 摘要:构建函数,创建模块,安装发布文件,安装pytest和PEP 8插件,确认PEP8兼容性以及纠错 重用代码是构建一个可维护系统的关键. 代码组是Python中对块的叫法. ...
- IO多路复用多并发服务器模板
import socket import selectors # IO多路复用选择器 epoll_selector = selectors.EpollSelector() # 实例化选择器 serve ...
- hadoop组件概念理解
一.HADOOP 二.HIVE 三.SQOOP 1.来由和作用 sqoop由一些封装好的MR程序的jar包构成,后演变成框架,但sqoop只有map任务没有reduce任务. 用于 hdfs.hive ...
- v-if、v-show 指令
HTML部分: <div id="app"> <button type="button" @click="flag=!flag&qu ...
- Ansible 连接主机显示报错的处理方案
一.在ansible安装完毕后一般需要以SSH的方式连接到需要进行管理的目标主机,一开始遇到了如下问题: 192.168.15.4 | UNREACHABLE! => { "ch ...
- ossec安装
安装 安装要求 对于Unix系统来说,OSSEC只需要GNU的make.gcc和libc.推荐使用OpenSSL,但仅属于一个可选项.而且,通常您只需在一个系统上做编译操作,然后将二进制程序复制到其他 ...
- 浅谈jQuery构造函数
$()函数到底做的什么 jQuery在前端领域路人皆知,对于一向喜欢玩js的博主来说,虽然能力有限,但是还是很喜欢研究他的做为.那么一个简单的美元符号$与一对常见的()括号,jQuery底层到底做了哪 ...