SPOJ - NSUBSTR Substrings(后缀自动机)
题目链接:点击查看
题目大意:给出一个字符串,求出每个长度下的子串出现最多的次数
题目分析:对原串跑后缀自动机然后记录每个节点的right集合的大小就是当前节点出现的次数了,这个出现次数显然可以从子节点向父节点传递,最后向上dp一下就是答案了
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=3e5+100;char s[N];int tot=1,last=1,id[N<<1],tong[N<<1],cnt[N<<1],ans[N];struct Node
{int ch[26];int fa,len;
}st[N<<1];void add(int x)
{int p=last,np=last=++tot;st[np].len=st[p].len+1;cnt[np]++;while(p&&!st[p].ch[x])st[p].ch[x]=np,p=st[p].fa;if(!p)st[np].fa=1;else{int q=st[p].ch[x];if(st[p].len+1==st[q].len)st[np].fa=q;else{int nq=++tot;st[nq]=st[q]; st[nq].len=st[p].len+1;st[q].fa=st[np].fa=nq;while(p&&st[p].ch[x]==q)st[p].ch[x]=nq,p=st[p].fa;//向上把所有q都替换成nq}}
}void radix_sort()
{for(int i=1;i<=tot;i++)tong[st[i].len]++;for(int i=1;i<=tot;i++)tong[i]+=tong[i-1];for(int i=1;i<=tot;i++)id[tong[st[i].len]--]=i;
}int main()
{
// freopen("input.txt","r",stdin);
// ios::sync_with_stdio(false);scanf("%s",s);int len=strlen(s);for(int i=0;i<len;i++)add(s[i]-'a');radix_sort();for(int i=tot;i>=1;i--){int cur=id[i],fa=st[cur].fa;cnt[fa]+=cnt[cur];}for(int i=1;i<=tot;i++)ans[st[i].len]=max(ans[st[i].len],cnt[i]);for(int i=1;i<=len;i++)printf("%d\n",ans[i]);return 0;
}
SPOJ - NSUBSTR Substrings(后缀自动机)相关推荐
- spoj 8222 Substrings (后缀自动机)
spoj 8222 Substrings 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 解题思路:我们构造S的SAM,那么对于 ...
- spoj 1811 LCS 后缀自动机
A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...
- SPOJ 1811 LCS [后缀自动机]
题意: 求两个串的最大连续子串 一个串建SAM,另一个串在上面跑 注意如果走了Suffix Link,sum需要更新为t[u].val+1 Suffix Link有点像失配吧,当前状态s走不了了就到S ...
- SPOJ 7258 SUBLEX 后缀自动机
求第k大子串. 按拓扑序处理出一个点往后有多少条路径到终态. 答案就很明显了. #include <cstring> #include <cstdio> #define FOR ...
- SPOJ - SUBLEX 【后缀自动机】
题目 求第K小子串 题解 建好SAM后,拓扑排序,反向传递后面所形成的串的数量 最后从根开始,按照儿子形成串的数量与k比较走就好了 #include<iostream> #include& ...
- SPOJ NSUBSTR(后缀自动机)
题目链接:http://www.spoj.com/problems/NSUBSTR/ 题目大意:给你一个字符串s(len(s)<=250000),求f[i](i=1...len(s)),其中f[ ...
- 【SPOJ】7258. Lexicographical Substring Search(后缀自动机)
http://www.spoj.com/problems/SUBLEX/ 后缀自动机系列完成QAQ...撒花..明天or今晚写个小结? 首先得知道:后缀自动机中,root出发到任意一个状态的路径对应一 ...
- 【后缀自动机】SPOJ 1812-LCSII
题意: 给出最多10个长度不超过100000的字符串,求他们的LCS的长度.时限是鬼畜的0.25s . 后缀自动机练习...虽然有人这么说但我并不觉得hash能过. 本题可以说是[论SAM中按step ...
- SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】
SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...
最新文章
- TiDB与gRPC的那点事
- 2018年4月26日笔记
- 数据库查询 添加伪列
- Github 2020年度报告:你以为新冠击溃了开发者?不!他们创造了更多代码...
- python菜鸟教程函数-Python 函数装饰器
- 电子管计算机的操作者是谁,大一计算机第一学期考试重点及相应习题 作者
- 函数声明、函数表达式、匿名函数、立即执行函数
- oracle idl_ub1$,system表空间急剧增大原因分析
- 内蒙古农大孙志宏教授证实超深度混合宏基因组测序能够对人类肠道微生物组中的低丰度物种进行基因组和功能表征...
- 对php的感受100字_这首由半个古风圈歌手演唱的王者荣耀100英雄群像歌,燃炸了...
- Android 深入ViewPager补间动画,实现类京东商城首页广告Banner切换效果
- Tensorflow笔记:搭建神经网络
- CENTOS安装XXNET
- Base理论是什么?之前也聊到过CAP理论
- 2018年度AI评选揭晓!10大领航企业,50家明星公司,10佳投资机构
- linux 网络问题 ipv4 forwarding
- 【YOLOv3从头训练 数据篇】
- 信任是高效工作的基石,但是得来却非常不易
- 计算机考研就业率,这8个考研专业,就业率一直居高不下,报了就是赚了!
- beeline连接hive的两种方式