洛谷 P3804 【模板】后缀自动机 统计单词出现次数
后缀自动机模板题.
关键时求解每个节点的 $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 【模板】后缀自动机 统计单词出现次数相关推荐
- 洛谷-P3975 弦论(后缀自动机板子题)
弦论 一道板子题,让我感觉板子题都还不会...然后把递推写成dfs时没有给string加上&,导致内存爆了,2333,果然还是传引用好 题意:求字典序第K小子串以及本质不同的第K小子串 思路: ...
- 信息学奥赛一本通 1400:统计单词数 | 1954:【11NOIP普及组】统计单词数 | OpenJudge NOI 1.12 05 | 洛谷 P1308 [NOIP2011 普及组] 统计单词数
[题目链接] ybt 1400:统计单词数 ybt 1954:[11NOIP普及组]统计单词数 OpenJudge NOI 1.12 05:统计单词数 洛谷 P1308 [NOIP2011 普及组] ...
- 信息学奥赛一本通 1239:统计数字 | 1847:【07NOIP提高组】统计数字 | OpenJudge NOI 2.4 7909 | 洛谷 P1097 [NOIP2007 提高组] 统计数字
[题目链接] ybt 1239:统计数字 ybt 1847:[07NOIP提高组]统计数字 一本通中限制不许使用STL,那么引入头文件不能写<bits/stdc++.h>,只能写<i ...
- java 计算i 出现的次数_JAVA算法:按照给定的段落统计单词出现次数(JAVA代码)...
https://blog.csdn.net/seagal890/article/details/92067644 JAVA算法:按照给定的段落统计单词出现次数(JAVA代码) 写一个 JAVA程序以统 ...
- 每天一个小程序—0004题(统计单词出现次数)
第 0004 题: 任一个英文的纯文本文件,统计其中的单词出现的个数. 先给出我一开始写得,只能说非常不优美,一个一个字符搞得... 1 f = open('num.txt') 2 word = [] ...
- java统计单词出现次数_java-统计一段句子中各单词出现的次数
问题:统计一段句子中各单词出现的次数. 思路: 1.使用split方法将文章进行分割,我们这里以空格.逗号和句点为分隔符,然后存到一个字符串数组中. 2.创建一个hashMap集合,key是字符串类型 ...
- 使用Eclipse开发工具运行MapReduce统计单词出现次数
使用Eclipse开发工具运行MapRuce统计单词出现次数 1.##我在这里将原先准备好的10000个单词的英语文章通过U盘移动到了Ubuntu系统中,也可以通过其它的方式,比如FTP传输或者将Ub ...
- 洛谷 P-4045 密码(AC自动机+状态压缩+数位DP+乱搞)
洛谷 P-4045 密码 记AC的第一道黑题! 题意:已知一段密码包含了一些字符串,然后求满足条件的密码有多少个,数量小于42时还得全部输出 思路: 一开始WA了两个点,不知道WA的什么,索性把读入的 ...
- 洛谷·【模板】点分树 | 震波【including 点分树
初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...
- 洛谷P1554——梦中的统计 解法(C++)
Hi 让大家久等了 今天再再再再再再再再再再再...来一道洛谷的题 梦中的统计(你们是不是已经厌烦了洛谷) 老规矩,先上个题目传送门(点击蓝字即可观看) 题目背景 Bessie 处于半梦半醒的状态.过 ...
最新文章
- JAVA 和.NET在安全功能的比较
- pytorch maxpool和卷积尺寸问题
- python+OpenCv+dlib实现人脸68个关键点检测
- HDU - 5875 Function(单调栈)
- Python报错UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe0 in position 0: ordinal not in range
- java都要caps标点_第 1 章 管理 Java CAPS 用户
- HDU 5876 关于补图的bfs
- matlab水蒸气焓值计算_焓变 反应热-化学选修4同步优质系列教案(人教版)
- Java垃圾回收GC概览
- elasticsearch报错exceptions.RequestError(400, u'mapper_parsing_exception', u'No handler field..
- SAS9.4安装简易教程(保姆级)附带报错处理
- 《疯狂的程序员》经典语录
- 12306为什么买票这么难
- 小红书的浏览量很低是为什么?有什么提高的方法吗?
- keil编写正弦函数_Keil C51编程控制倍频正弦信号的产生
- airtest 获取分辨率 绝对坐标 相对坐标
- ATFX:小非农不及预期,今晚大非农表现如何?
- 狡兔三窟,新手创业淘宝无货源店群模式该如何自处?
- 怪异盒模型flex布局
- 《算法》(第四版)------------图
热门文章
- [bzoj 3110][zjoi 2013]K大数查询
- Android UI进阶之旅3 Material Design之侧滑菜单的两种实现
- rabbitmq消息持久化,避免异常情况下,消息会丢失
- @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别 .(转)
- 稳坐CACTI,遥知千里
- [Serializable]C#中的对象序列化
- 深入浅出ObjC之消息
- 廖雪峰Java10加密与安全-3摘要算法-3SHA-1算法
- C++ 訪问控制权限图解
- hibernate 批量插入 Batch