2018.12.15 spoj Substrings(后缀自动机)
传送门
后缀自动机基础题。
求长度为iii的子串出现次数的最大值。
对原串建出samsamsam,然后用sizsizsiz更新每个maxlenmaxlenmaxlen的答案。
然后由于后缀链接将其转化成了一种树形结构,因此直接在上面树形递推即可。
代码
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=5e5+5;
int n;
char s[N];
struct SAM{
	int f[N],siz[N],cnt[N],rk[N],len[N],link[N],son[N][26],tot,rt,last;
	SAM(){last=rt=tot=1,len[0]=-1,fill(son[0],son[0]+26,1);}
	inline void expend(int x){
		int p=last,np=++tot;
		siz[last=np]=1,len[np]=len[p]+1;
		while(p&&!son[p][x])son[p][x]=np,p=link[p];
		if(!p){link[np]=rt;return;}
		int q=son[p][x],nq;
		if(len[q]==len[p]+1){link[np]=q;return;}
		len[nq=++tot]=len[p]+1,memcpy(son[nq],son[q],sizeof(son[q])),link[nq]=link[q];
		while(p&&son[p][x]==q)son[p][x]=nq,p=link[p];
		link[np]=link[q]=nq;
	}
	inline void topsort(){
		for(ri i=1;i<=tot;++i)++cnt[len[i]];
		for(ri i=1;i<=last;++i)cnt[i]+=cnt[i-1];
		for(ri i=1;i<=tot;++i)rk[cnt[len[i]]--]=i;
		for(ri i=tot;i;--i)siz[link[rk[i]]]+=siz[rk[i]];
		for(ri i=1;i<=tot;++i)f[len[i]]=max(f[len[i]],siz[i]);
		for(ri i=n-1;i;--i)f[i]=max(f[i],f[i+1]);
		for(ri i=1;i<=n;++i)cout<<f[i]<<'\n';
	}
}sam;
int main(){
	freopen("lx.in","r",stdin);
	scanf("%s",s+1),n=strlen(s+1);
	for(ri i=1;i<=n;++i)sam.expend(s[i]-'a');
	sam.topsort();
	return 0;
}
												
											2018.12.15 spoj Substrings(后缀自动机)的更多相关文章
- 2018.12.15 spoj Longest Common Substring II(后缀自动机)
		
传送门 后缀自动机基础题. 给出10个串求最长公共子串. 我们对其中一个建一个samsamsam,然后用剩下九个去更新范围即可. 代码: #include<bits/stdc++.h> # ...
 - Tencent Cloud Developers Conference(2018.12.15)
		
时间:2018.12.15地点:北京朝阳悠唐皇冠假日酒店
 - 2018.12.15 poj3415 Common Substrings(后缀自动机)
		
传送门 后缀自动机基础题. 给两个字符串,让你求长度不小于kkk的公共子串的数量. 这题可以用后缀自动机解决废话 考虑对其中一个字串建出后缀自动机,然后用另一个在上面跑,注意到如果一个状态有贡献的话, ...
 - 2018.12.15 hdu4641 K-string(后缀自动机)
		
传送门 后缀自动机基础题. 题意简述:支持动态在串尾插入字符,查询在串中出现超过kkk次的子串的个数. 动态修改samsamsam,每次增量构造好了之后在parentparentparent树上从新建 ...
 - 2018.12.15 bzoj3998: [TJOI2015]弦论(后缀自动机)
		
传送门 后缀自动机基础题. 求第kkk小的子串(有可能要求本质不同) 直接建出samsamsam,然后给每个状态赋值之后在上面贪心选最小的(过程可以类比主席树/平衡树的查询操作)即可. 代码: #in ...
 - 2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)
		
传送门 对原串建立一个后缀自动机,然后用反串在上面匹配. 如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l, ...
 - 2018.12.15 spoj1812 Longest Common Substring(后缀自动机)
		
传送门 后缀自动机模板题. 题意简述:求两个字串的最长公共子串长度. 对其中一个构建后缀自动机,用另外一个在上面跑即可. 代码: #include<bits/stdc++.h> #defi ...
 - ●SPOJ 8222 NSUBSTR–Substrings(后缀自动机)
		
题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 后缀自动机的水好深啊!懂不了相关证明,带着结论把这个题做了.看来这滩深水要以后再来了. 本题要用到一个叫 R ...
 - SPOJ NSUBSTR Substrings 后缀自动机
		
人生第一道后缀自动机,总是值得纪念的嘛.. 后缀自动机学了很久很久,先是看CJL的论文,看懂了很多概念,关于right集,关于pre,关于自动机的术语,关于为什么它是线性的结点,线性的连边.许多铺垫的 ...
 
随机推荐
- unary
			
unary - 必应词典 adj.[数]单元的 网络一元:一元的:一元码 例句Returns a value generated by rolling up the values of the c ...
 - TypeScript之定义类型 ( type )
			
键值对结构的对象 export type ValidationErrors = { [key: string]: any }; 联合类型(union type) export type HttpEve ...
 - day 10  函数名的运用,闭包,迭代器
			
函数名的本质 函数名本质上就是函数的内存地址 函数名的五种运用: 1.函数名是一个变量 def func(): print(666) print(func) # 函数的内存地址 <functio ...
 - python 爬取网页基础  requests使用
			
pip install requests 安装requests库 基本顺序: import requests r=requests.get("url路径") r.status_c ...
 - spring boot 访问项目时加项目名称
			
pringboot 项目一般直接地址加端口就可以访问了,不像放在tomcat里面还需要加上项目名. 现在,想访问的时候加上项目名用来区分,只要在配置文件里面加上 server.context-path ...
 - YII2中查询生成器Query()的使用
			
YII2中的yii\db\Query给我们提供了非常丰富的方法,方便我们构建复杂的SQL语句. Query()与createCommand最大区别在于,后者直接使用我们写好的SQL语句,前者通过参数和 ...
 - golang语言中bytes包的常用函数,Reader和Buffer的使用
			
bytes中常用函数的使用: package main; import ( "bytes" "fmt" "unicode" ) //byte ...
 - mvc中webapi添加后没法访问 解决办法
			
原因:原先项目中没有webapi,后来添加的. 然后就没法正常访问,百度了下发现是 App_Start/WebApiConfig.cs中路由配置多了个api 而且没有加{action}, 然后修改成: ...
 - Windows下adobe Reader中pdf字体helvetica被替换为ArialMT
			
笔者最近java项目中用itext-2.1.7导出pdf,使用了Helvetica,这个字体是内置的字体,本地Adobe Reader版本9.0 导出的文字是img.nur.cn实际效果 查看了pdf ...
 - Android Studio 使用入门
			
Android Studio 快捷键 Action Mac OSX Win/Linux 注释代码(//) Cmd + / Ctrl + / 注释代码(/**/) Cmd + Option + / Ct ...