题目描述

给定一个只包含小写字母的字符串SS ,

请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值。

输入输出格式

输入格式:

一行一个仅包含小写字母的字符串SS

输出格式:

一个整数,为 所求答案

输入输出样例

输入样例#1:

abab
输出样例#1:

4

说明

对于10\%10% 的数据,|S|<=1000∣S∣<=1000

对于100\%100% 的数据,|S|<=10^6∣S∣<=106

今天上午恶补了一下后缀自动机,发现好像没有想象中的那么难,,,,

对于本题来说,我们只要把后缀自动机建出来,然后逆序dfs维护一下非根非叶子的right集合大小*max{}的最大值即可。

#include<bits/stdc++.h>
#define ll long long
#define maxn 4000005
#define pb push_back
using namespace std;
int root=1,tot=1,n;
char s[maxn];
int f[maxn],ch[maxn][27];
int siz[maxn],las=1,l[maxn];
int a[maxn],c[maxn];
ll ans=0; inline void ins(int x){
int p=las,np=++tot;
las=np,l[np]=l[p]+1;
siz[np]=1; for(;p&&!ch[p][x];p=f[p]) ch[p][x]=np;
if(!p) f[np]=1;
else{
int q=ch[p][x];
if(l[q]==l[p]+1) f[np]=q;
else{
int nq=++tot;
l[nq]=l[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
f[nq]=f[q];
f[q]=f[np]=nq;
for(;ch[p][x]==q;p=f[p]) ch[p][x]=nq;
}
}
} inline void build(){
for(int i=0;i<n;i++) ins(s[i]-'a');
for(int i=1;i<=tot;i++) c[l[i]]++;
for(int i=n;i>=0;i--) c[i]+=c[i+1];
for(int i=1;i<=tot;i++) a[c[l[i]]--]=i;
} inline void solve(){
for(int i=1;i<=tot;i++){
int now=a[i];
siz[f[now]]+=siz[now];
if(siz[now]>1&&siz[now]<n) ans=max(ans,siz[now]*(ll)l[now]);
}
} int main(){
scanf("%s",s);
n=strlen(s);
build();
solve();
printf("%lld\n",ans);
return 0;
}

  

洛谷 P3804 后缀自动机的更多相关文章

  1. 【后缀自动机】洛谷P3804模板题

    题目描述 给定一个只包含小写字母的字符串SSS, 请你求出 SSS 的所有出现次数不为 111 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SSS ...

  2. 洛谷P3804 【模板】后缀自动机

    题目描述 给定一个只包含小写字母的字符串 SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串 SS ...

  3. 洛谷 P3804 【模板】后缀自动机 统计单词出现次数

    后缀自动机模板题. 关键时求解每个节点的 $right$ 大小. 由于后缀自动机在构建时会保证点和点的 $right$ 只可能没有交集,或者一个是另一个的真子集,我们可以不重复的对 $right$ 进 ...

  4. 洛谷 P3804 [模板] 后缀自动机

    题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...

  5. 洛谷 P3804 【模板】后缀自动机

    来一份模板 #include<cstdio> #include<algorithm> #include<cstring> #include<queue> ...

  6. 【刷题】洛谷 P3804 【模板】后缀自动机

    题目描述 给定一个只包含小写字母的字符串 \(S\) , 请你求出 \(S\) 的所有出现次数不为 \(1\) 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字 ...

  7. 【洛谷 P3804】 【模板】后缀自动机

    题目链接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...

  8. 洛谷 P1449 后缀表达式 Label:表达式计算系列

    题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应 ...

  9. 洛谷P3809 后缀排序【后缀数组】【模板】

    题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编 ...

随机推荐

  1. Python学习3,列表

    列表就是能够包含几个或者上千上万个元素,对我这种新手来说应该是最重要的了! _author_ = "Happyboy" shopping = ['Iphone','Huawei', ...

  2. msql 数据库介绍和启动

    什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储在文件中,但 ...

  3. Python全栈工程师(编码)

    ParisGabriel       Python 入门基础   补充: 主流3操作大系统 Windows: Winxp   Win7 Win8 Win10 Unix: Solaris(SUN) IO ...

  4. 上手Caffe(一)

    @author:oneBite 本文记录编译使用caffe for windows 使用环境 VS2013 ultimate,win7 sp1,caffe-windows源码(从github上下载ca ...

  5. Leetcode 667.优美的排列II

    优美的排列II 给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件: ① 如果这个数组是 [a1, a2, a3, ... , an] ,那 ...

  6. 第一次软件工程作业补充plus

    一.代码的coding地址:coding地址. 二.<构建之法>读后问题以及感言(补充): 1.对于7.3MSF团队模型,7.2.6保持敏捷,预期和适应变化,中的"我们是预期变化 ...

  7. 团队项目-任务分解[Alpha0]

    团队项目-任务分解[Alpha0] 标签(空格分隔): 团队博客 适用范围: 本文档 适用对象 团队全体成员 适用时间 alpha阶段第一周计划 10.24-10.28 适用内容 目标.分工.时长估计 ...

  8. 贪吃蛇StringBuilder 和 定时器

    ConsoleKeyInfo info = Console.ReadKey(); while (true) { if (info.Key == ConsoleKey.UpArrow)//只能输入一次但 ...

  9. POJ 3304 Segments | 线段相交

    #include<cstdio> #include<algorithm> #include<cstring> #define N 105 #define eps 1 ...

  10. HDU 1863 畅通工程 -Kruskal模版

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...