Luogu3804 【模板】后缀自动机
题面
题解
一个串的出现次数等于$endpos$的大小,也是$parent$树上节点的$size$大小,
构建出后缀自动机,按拓补序,模拟即可。
代码
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define RG register
#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define clear(x, y) memset(x, y, sizeof(x))
inline int read()
{
int data = 0, w = 1; char ch = getchar();
while(ch != '-' && (!isdigit(ch))) ch = getchar();
if(ch == '-') w = -1, ch = getchar();
while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar();
return data * w;
}
const int maxn(1e6 + 10), maxm(maxn << 1);
int last = 1, cnt = 1;
char s[maxn];
long long ans;
int size[maxm], c[maxm], a[maxm];
struct node { int son[26], fa, len; } t[maxm];
void extend(int c)
{
node *p = t + last, *newp = &t[++cnt]; last = cnt;
newp -> len = p -> len + 1;
while(p - t && !p -> son[c]) p -> son[c] = newp - t, p = &t[p -> fa];
if(!(p - t)) newp -> fa = 1;
else
{
node *q = &t[p -> son[c]];
if(p -> len + 1 == q -> len) newp -> fa = q - t;
else
{
node *newq = &t[++cnt]; *newq = *q;
newq -> len = p -> len + 1;
q -> fa = newp -> fa = newq - t;
while(p - t && p -> son[c] == q - t)
p -> son[c] = newq - t, p = &t[p -> fa];
}
}
size[newp - t] = 1;
}
int main()
{
#ifndef ONLINE_JUDGE
file(cpp);
#endif
scanf("%s", s + 1);
for(RG int i = 1, l = strlen(s + 1); i <= l; i++) extend(s[i] - 97);
for(node *i = t + 1; i != t + cnt + 1; i++) ++c[i -> len];
for(RG int i = 1; i <= cnt; i++) c[i] += c[i - 1];
for(node *i = t + 1; i != t + cnt + 1; i++) a[c[i -> len]--] = i - t;
for(RG int i = cnt; i; i--)
{
node *now = t + a[i];
size[now -> fa] += size[a[i]];
if(size[a[i]] > 1) ans = std::max(ans, 1ll * size[a[i]] * now -> len);
}
printf("%lld\n", ans);
return 0;
}
Luogu3804 【模板】后缀自动机的更多相关文章
- [模板] 后缀自动机&&后缀树
后缀自动机 后缀自动机是一种确定性有限状态自动机, 它可以接收字符串\(s\)的所有后缀. 构造, 性质 翻译自毛子俄罗斯神仙的博客, 讲的很好 后缀自动机详解 - DZYO的博客 - CSDN博客 ...
- Luogu3804:[模板]后缀自动机
题面 luogu Sol \(sam\)然后树形\(DP\) 当时还不会拓扑排序的我 # include <bits/stdc++.h> # define IL inline # defi ...
- 洛谷 P3804 [模板] 后缀自动机
题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...
- 【Luogu3804】【模板】后缀自动机(后缀自动机)
[Luogu3804][模板]后缀自动机(后缀自动机) 题面 洛谷 题解 一个串的出现次数等于\(right/endpos\)集合的大小 而这个集合的大小等于所有\(parent\)树上儿子的大小 这 ...
- 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...
- P3804 【模板】后缀自动机
P3804 [模板]后缀自动机 后缀自动机模板 详情可见luogu题解板块 #include<iostream> #include<cstdio> #include<cs ...
- 2018.07.17 后缀自动机模板(SAM)
洛谷传送门 这是一道后缀自动机的模板题,这道题让我切身体会到了后缀自动机的方便与好写. 代码如下: #include<bits/stdc++.h> #define N 2000005 #d ...
- 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 A.串串-后缀自动机模板题
链接:https://ac.nowcoder.com/acm/contest/558/A来源:牛客网 A.串串 小猫在研究字符串. 小猫在研究字串. 给定一个长度为N的字符串S,问所有它的子串Sl…r ...
- SPOJ 8222. Substrings(后缀自动机模板)
后缀自动机+dp. 后缀自动机主要是在functioner大牛那里学习的:http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html 这道题是在No_st ...
随机推荐
- 把对象缓存到HttpRuntime.Cache里,你能安全地使用它吗?
每每勤勤恳恳,思来想去,趁还有激情,先把它记录下来... 定义一个Stu的类: public class Stu { public string Name { get; set; } public i ...
- Scrum培训小体会
公司组织Scrum培训. 虽然是针对ScrumMaster这个角色的培训,但更多是基于对Scrum这个敏捷开发实践方法的了解. 回来也有一些感想,记录下来.以后在工作实践中,继续探索.实践.体验.感悟 ...
- yii2数据库简单操作
1.简单查询: one(): 根据查询结果返回查询的第一条记录. all(): 根据查询结果返回所有记录. count(): 返回记录的数量. sum(): 返回指定列的总数. average(): ...
- 【Mybatis】参数处理
单个参数:mybatis不会做特殊处理, #{参数名/任意名}:取出参数值. 多个参数:mybatis会做特殊处理. 多个参数会被封装成 一个map, key:param1...paramN,或者参数 ...
- [Luogu1282]多米诺骨牌(DP)
#\(\color{red}{\mathcal{Description}}\) \(Link\) 我们有一堆多米诺骨牌,上下两个部分都有点数,\(But\)我们有一个操作是可以对调上下的点数.若记一块 ...
- useradd添加用户
sudo useradd -m -s /bin/bash $user sudo passwd $user linux useradd/userdel 命令 转自:http://hi.baidu.com ...
- Kubernetes(一)--简介
一.什么是kubernetes(K8s)? Kubernetes作为容器编排生态圈中重要一员,是Google大规模容器管理系统borg的开源版本实现,吸收借鉴了google过去十年间在生产环境上所学到 ...
- eclipse的svn插件
SVN插件下载地址及更新地址,你根据需要选择你需要的版本.现在最新是1.8.xLinks for 1.8.x Release:Eclipse update site URL: http://subcl ...
- js中的冒泡排序
<!-- 冒泡排序:把一组数列按照一定的顺序进行排列,从大到小,或者从小到大 --> // 控制循环的轮数 arr = [3,14,55,2,1,4,5 ...
- 非空校验在oracle和mysql中的用法
oracle判断是否为null nvl(参数1,参数2) :如果参数1为null则返回参数2,否则返回参数1 mysql判断是否为null ifnull(参数1,参数2) :如果参数1为null则返回 ...