2018.07.17 后缀自动机模板(SAM)
洛谷传送门
这是一道后缀自动机的模板题,这道题让我切身体会到了后缀自动机的方便与好写。
代码如下:
#include<bits/stdc++.h>
#define N 2000005
#define ll long long
using namespace std;
char s[N];
int a[N],siz[N],n,tot[N],root=1;
ll ans=0;
struct suf{
int last,cnt,ch[N<<1][26],fa[N<<1],len[N];
inline void build(){
scanf("%s",s+1),last=cnt=1;
int l=strlen(s+1);
for(int i=1;i<=l;++i)insert(s[i]-'a');
}
inline void solve(){
for(int i=1;i<=cnt;++i)++tot[len[i]];
for(int i=1;i<=cnt;++i)tot[i]+=tot[i-1];
for(int i=1;i<=cnt;++i)a[tot[len[i]]--]=i;
for(int i=cnt;i;--i){
int p=a[i];
siz[fa[p]]+=siz[p];
if(siz[p]>1)ans=max(ans,1ll*len[p]*siz[p]);
}
printf("%lld",ans);
}
inline void insert(int c){
int p=last,newp=++cnt;
last=newp,len[newp]=len[p]+1;
for(;p&&!ch[p][c];p=fa[p])ch[p][c]=newp;
if(!p)fa[newp]=root;
else{
int q=ch[p][c];
if(len[p]+1==len[q])fa[newp]=q;
else{
int newq=++cnt;
len[newq]=len[p]+1;
memcpy(ch[newq],ch[q],sizeof(ch[q]));
fa[newq]=fa[q],fa[q]=fa[newp]=newq;
for(;ch[p][c]==q;p=fa[p])ch[p][c]=newq;
}
}
siz[newp]=1;
}
}sam;
int main(){
sam.build();
sam.solve();
return 0;
}
2018.07.17 后缀自动机模板(SAM)的更多相关文章
- 后缀自动机模板 SAM
一点疑问: 当创建nq节点时,要不要把nq的cnt标记赋值为1? 讲道理nq节点也是代表一个子串啊,不过网上的模板都没赋值. 2017.9.18 update: 把memset部分重写,改成用节点用到 ...
- 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 A.串串-后缀自动机模板题
链接:https://ac.nowcoder.com/acm/contest/558/A来源:牛客网 A.串串 小猫在研究字符串. 小猫在研究字串. 给定一个长度为N的字符串S,问所有它的子串Sl…r ...
- hdu4622(后缀自动机模板)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意: 先输入一个长度为 n 的字符串, 然后有 q 个形如 l, r 的询问, 对于每个询问 ...
- 2018.07.17 HAOI2016 找相同字符(SAM)
传送门 就是给两个字符串,让你求公共字串的个数. 本来大佬们都是用的广义后缀自动机,但我感觉后缀自动机已经可以做这道题了.我们对其中一个字串建出后缀自动机,然后用另外一个后缀自动机在上面统计贡献即可. ...
- 后缀自动机(SAM)
*在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...
- 【学习笔记】浅析后缀自动机(SAM)及基础应用
解决子串相关问题的强大工具 我们知道一个长度为 \(n\) 的字符串中所有的子串数目为 \(O(n^2)\) 个,这很大程度上限制了我们对某些子串相关问题的研究.所以有没有解决方案,使得我们可以在可承 ...
- 后缀自动机(SAM)+广义后缀自动机(GSA)
经过一顿操作之后竟然疑似没退役0 0 你是XCPC选手吗?我觉得我是! 稍微补一点之前丢给队友的知识吧,除了数论以外都可以看看,为Dhaka和新队伍做点准备... 不错的零基础教程见 IO WIKI ...
- 后缀自动机(SAM)学习笔记
目录 定义 SAM 的状态集 一些性质 SAM 的后缀链接 SAM 的转移函数 一些性质 算法构造 构造方法 时间复杂度证明 状态的数量 转移的数量 代码实现 实际应用 统计本质不同的子串个数 计算任 ...
- POJ 1509 Glass Beads 后缀自动机 模板 字符串的最小表示
http://poj.org/problem?id=1509 后缀自动机其实就是一个压缩储存空间时间(对节点重复利用)的储存所有一个字符串所有子串的trie树,如果想不起来长什么样子可以百度一下找个图 ...
随机推荐
- ArrayList 原理(1)
ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...
- Spring 集成Hibernate的三种方式
首先把hibernate的配置文件hibernate.cfg.xml放入spring的src目录下,并且为了便于测试导入了一个实体类Student.java以及它的Student.hbm.xml文件 ...
- scala -- 递归 实现 斐波那契函数
求一个起始为0,1,1,2,3的斐波那契序列 def main(args: Array[String]): Unit = { def fib(n: Int): Int = { if (n == 1) ...
- PHP与apache配置
在apache 的安装路径中找到 \conf\httpd.conf文件 在 LoadModule最后面添加如下代码: PHPIniDir "D:\PHP"LoadModule ph ...
- 基元线程同步构造之waithandle中 waitone使用
在使用基元线程同步构造中waithandle中waitone方法的讲解: 调用waithandle的waitone方法阻止当前线程(提前是其状态为Nonsignaled,即红灯),直到当前的 Wait ...
- 部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930;
描述:部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930: 原因:所有物料规划PR时对舍入值的先后考虑逻辑影响到回写出来的temp ...
- input限制数字输入
onkeyup="this.value=this.value.replace(/\D/g,'')"
- Dungeon Game (GRAPH - DP)
QUESTION The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a ...
- Treasures and Vikings(两次搜索)
Treasures and Vikings https://www.luogu.org/problemnew/show/P4668 题意翻译 你有一张藏宝图,藏宝图可视为 N×MN×M 的网格.每个格 ...
- php中的declare
<?php // 事件的回调函数 function func_tick() { echo "call...\r\n"; } // 注册事件的回调函数 register_tic ...