后缀自动机模板题.

关键时求解每个节点的 $right$ 大小.

由于后缀自动机在构建时会保证点和点的 $right$ 只可能没有交集,或者一个是另一个的真子集,我们可以不重复的对 $right$ 进行统计与更新.

从长度大的子串向前更新,沿着 $parent$ 跳即可.

最后再枚举一下.

Code:

#include <cstdio>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 3000000
#define N 30
#define ll long long
using namespace std;
int last=1,tot=1,n;
int ch[maxn][N],cnt[maxn],f[maxn],dis[maxn],rk[maxn];
ll C[maxn],ans;
char str[maxn];
struct Suffix_Automaton{void ins(int c){int p=last,np=++tot; last=np; dis[np]=dis[p]+1; while(p&&!ch[p][c])ch[p][c]=np,p=f[p];if(!p) f[np]=1;else{int q=ch[p][c],nq;  if(dis[q]==dis[p]+1) f[np]=q;else{nq=++tot; dis[nq]=dis[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[q]));f[nq]=f[q],f[q]=f[np]=nq;while(p&&ch[p][c]==q) ch[p][c]=nq,p=f[p]; } }cnt[last]=1; }
}sam;
int main(){//setIO("input");scanf("%s",str),n=strlen(str);for(int i=0;i<n;++i) sam.ins(str[i]-'a'); for(int i=1;i<=tot;++i) ++C[dis[i]]; for(int i=1;i<=tot;++i) C[i]+=C[i-1];  for(int i=1;i<=tot;++i) rk[C[dis[i]]--]=i;for(int i=tot;i>=1;--i){int p=rk[i];cnt[f[p]]+=cnt[p];if(cnt[p]>1) ans=max(ans,(ll)cnt[p]*dis[p]); }printf("%lld",ans); return 0;
}

  

转载于:https://www.cnblogs.com/guangheli/p/10290339.html

洛谷 P3804 【模板】后缀自动机 统计单词出现次数相关推荐

  1. 洛谷-P3975 弦论(后缀自动机板子题)

    弦论 一道板子题,让我感觉板子题都还不会...然后把递推写成dfs时没有给string加上&,导致内存爆了,2333,果然还是传引用好 题意:求字典序第K小子串以及本质不同的第K小子串 思路: ...

  2. 信息学奥赛一本通 1400:统计单词数 | 1954:【11NOIP普及组】统计单词数 | OpenJudge NOI 1.12 05 | 洛谷 P1308 [NOIP2011 普及组] 统计单词数

    [题目链接] ybt 1400:统计单词数 ybt 1954:[11NOIP普及组]统计单词数 OpenJudge NOI 1.12 05:统计单词数 洛谷 P1308 [NOIP2011 普及组] ...

  3. 信息学奥赛一本通 1239:统计数字 | 1847:【07NOIP提高组】统计数字 | OpenJudge NOI 2.4 7909 | 洛谷 P1097 [NOIP2007 提高组] 统计数字

    [题目链接] ybt 1239:统计数字 ybt 1847:[07NOIP提高组]统计数字 一本通中限制不许使用STL,那么引入头文件不能写<bits/stdc++.h>,只能写<i ...

  4. java 计算i 出现的次数_JAVA算法:按照给定的段落统计单词出现次数(JAVA代码)...

    https://blog.csdn.net/seagal890/article/details/92067644 JAVA算法:按照给定的段落统计单词出现次数(JAVA代码) 写一个 JAVA程序以统 ...

  5. 每天一个小程序—0004题(统计单词出现次数)

    第 0004 题: 任一个英文的纯文本文件,统计其中的单词出现的个数. 先给出我一开始写得,只能说非常不优美,一个一个字符搞得... 1 f = open('num.txt') 2 word = [] ...

  6. java统计单词出现次数_java-统计一段句子中各单词出现的次数

    问题:统计一段句子中各单词出现的次数. 思路: 1.使用split方法将文章进行分割,我们这里以空格.逗号和句点为分隔符,然后存到一个字符串数组中. 2.创建一个hashMap集合,key是字符串类型 ...

  7. 使用Eclipse开发工具运行MapReduce统计单词出现次数

    使用Eclipse开发工具运行MapRuce统计单词出现次数 1.##我在这里将原先准备好的10000个单词的英语文章通过U盘移动到了Ubuntu系统中,也可以通过其它的方式,比如FTP传输或者将Ub ...

  8. 洛谷 P-4045 密码(AC自动机+状态压缩+数位DP+乱搞)

    洛谷 P-4045 密码 记AC的第一道黑题! 题意:已知一段密码包含了一些字符串,然后求满足条件的密码有多少个,数量小于42时还得全部输出 思路: 一开始WA了两个点,不知道WA的什么,索性把读入的 ...

  9. 洛谷·【模板】点分树 | 震波【including 点分树

    初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...

  10. 洛谷P1554——梦中的统计 解法(C++)

    Hi 让大家久等了 今天再再再再再再再再再再再...来一道洛谷的题 梦中的统计(你们是不是已经厌烦了洛谷) 老规矩,先上个题目传送门(点击蓝字即可观看) 题目背景 Bessie 处于半梦半醒的状态.过 ...

最新文章

  1. JAVA 和.NET在安全功能的比较
  2. pytorch maxpool和卷积尺寸问题
  3. python+OpenCv+dlib实现人脸68个关键点检测
  4. HDU - 5875 Function(单调栈)
  5. Python报错UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe0 in position 0: ordinal not in range
  6. java都要caps标点_第 1 章 管理 Java CAPS 用户
  7. HDU 5876 关于补图的bfs
  8. matlab水蒸气焓值计算_焓变 反应热-化学选修4同步优质系列教案(人教版)
  9. Java垃圾回收GC概览
  10. elasticsearch报错exceptions.RequestError(400, u'mapper_parsing_exception', u'No handler field..
  11. SAS9.4安装简易教程(保姆级)附带报错处理
  12. 《疯狂的程序员》经典语录
  13. 12306为什么买票这么难
  14. 小红书的浏览量很低是为什么?有什么提高的方法吗?
  15. keil编写正弦函数_Keil C51编程控制倍频正弦信号的产生
  16. airtest 获取分辨率 绝对坐标 相对坐标
  17. ATFX:小非农不及预期,今晚大非农表现如何?
  18. 狡兔三窟,新手创业淘宝无货源店群模式该如何自处?
  19. 怪异盒模型flex布局
  20. 《算法》(第四版)------------图

热门文章

  1. [bzoj 3110][zjoi 2013]K大数查询
  2. Android UI进阶之旅3 Material Design之侧滑菜单的两种实现
  3. rabbitmq消息持久化,避免异常情况下,消息会丢失
  4. @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别 .(转)
  5. 稳坐CACTI,遥知千里
  6. [Serializable]C#中的对象序列化
  7. 深入浅出ObjC之消息
  8. 廖雪峰Java10加密与安全-3摘要算法-3SHA-1算法
  9. C++ 訪问控制权限图解
  10. hibernate 批量插入 Batch