SPOJ 8222. Substrings(后缀自动机模板)
后缀自动机+dp。
后缀自动机主要是在functioner大牛那里学习的:http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html
这道题是在No_stop大牛那里学习的:http://blog.csdn.net/no__stop/article/details/11784715
特别感谢这两位大牛!贴上代码作为以后的模板吧。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define CLR(a, b) memset(a, b, sizeof(a)) using namespace std;
const int N = 550000; struct suffix_automaton
{
char s[N];
int chd[N][26],pre[N],step[N];
int last,tot;
inline void rush(int v)
{
step[++tot]=v;
CLR(chd[tot], 0);
}
void Extend(int ch)
{
rush(step[last]+1);
int p=last,np=tot;
for (; !chd[p][ch]; p=pre[p]) chd[p][ch]=np;
if (!p) pre[np]=1;
else
{
int q=chd[p][ch];
if (step[q]!=step[p]+1)
{
rush(step[p]+1);
int nq=tot;
memcpy(chd[nq],chd[q],sizeof(chd[q]));
pre[nq]=pre[q];
pre[q]=pre[np]=nq;
for (; chd[p][ch]==q; p=pre[p]) chd[p][ch]=nq;
} else pre[np]=q;
}
last=np;
}
void Build()
{
scanf("%s", s);
tot = last = 1;
CLR(pre,0);CLR(step,0);CLR(chd[1], 0);
for (int i=0,End=strlen(s); i<End; i++) Extend(s[i]-'a');
}
int pos[N], cnt[N], dp[N], g[N];
void Work()
{
Build();
int len = strlen(s);dp[0] = 0;
for(int i = 0; i <= len; i ++) cnt[i] = 0;///清零
for(int i = 1; i <= tot; i ++) cnt[step[i]] ++;///统计长度为step[i]的节点个数。
for(int i = 1; i <= len; i ++) cnt[i] += cnt[i - 1];///用来hash到(1-tot)。
for(int i = 1; i <= tot; i ++) pos[cnt[step[i]] --] = i, g[i] = dp[i] = 0;///pos表示长度为step[i]的串位置为i。
int p = 1;
for(int i = 0; i < len; i ++) g[p = chd[p][s[i] - 'a']] ++;///顺着串走一遍
for(int i = tot; i > 0; i --)///反着来,确保right集合可以用pre求个数。
{
p = pos[i];///反hash
dp[step[p]] = max(dp[step[p]], g[p]);
g[pre[p]] += g[p];///求right集合元素个数。
}
for(int i = len - 1; i > 0; i --)
dp[i] = max(dp[i], dp[i + 1]);
for(int i = 1; i <= len; i ++)
printf("%d\n", dp[i]);
}
}Suf; int main()
{
Suf.Work();
}
SPOJ 8222. Substrings(后缀自动机模板)的更多相关文章
- spoj 8222 Substrings (后缀自动机)
spoj 8222 Substrings 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 解题思路:我们构造S的SAM,那么对于 ...
- SPOJ NSUBSTR Substrings 后缀自动机
人生第一道后缀自动机,总是值得纪念的嘛.. 后缀自动机学了很久很久,先是看CJL的论文,看懂了很多概念,关于right集,关于pre,关于自动机的术语,关于为什么它是线性的结点,线性的连边.许多铺垫的 ...
- SPOJ NSUBSTR Substrings ——后缀自动机
建后缀自动机 然后统计次数,只需要算出right集合的大小即可, 然后更新f[l[i]]和rit[i]取个max 然后根据rit集合短的一定包含长的的性质,从后往前更新一遍即可 #include &l ...
- spoj 1812 lcsII (后缀自动机)
spoj 1812 lcsII (后缀自动机) 题意:求多个串的lcs,最多10个串,每个串最长10w 解题思路:后缀自动机.先建好第一个串的sam,然后后面的串拿上去跑(这个过程同前一题).sam上 ...
- 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 A.串串-后缀自动机模板题
链接:https://ac.nowcoder.com/acm/contest/558/A来源:牛客网 A.串串 小猫在研究字符串. 小猫在研究字串. 给定一个长度为N的字符串S,问所有它的子串Sl…r ...
- hdu4622(后缀自动机模板)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意: 先输入一个长度为 n 的字符串, 然后有 q 个形如 l, r 的询问, 对于每个询问 ...
- ●SPOJ 8222 NSUBSTR–Substrings(后缀自动机)
题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 后缀自动机的水好深啊!懂不了相关证明,带着结论把这个题做了.看来这滩深水要以后再来了. 本题要用到一个叫 R ...
- Substrings SPOJ - NSUBSTR (后缀自动机)
Substrings \[ Time Limit: 100ms\quad Memory Limit: 1572864 kB \] 题意 给出一个长度为 \(250000\) 的字符串,求出所有 \(x ...
- spoj - Longest Common Substring(后缀自动机模板题)
Longest Common Substring 题意 求两个串的最长公共子串. 分析 第一个串建后缀自动机,第二个串在自动机上跑,对于自动机上的结点(状态)而言,它所代表的最大长度为根结点到当前结点 ...
随机推荐
- 前端调试利器---nproxy
前言:习惯了在windows环境中使用Fiddler的童鞋们,是不是感觉它的网络重定向功能很酷,Fiddler能按照你设置的规制捕获网络请求,再指向本地文件,如拦截你的js文件到本地,就能很快的调试线 ...
- CSS——操作css文件
//动态 css文件内容. 修改鼠标经过时行.单元格的背景颜色 function header_rowOrcell_over(divGrid) { var gridopts = divGrid.dat ...
- Linux监控和安全运维 2.0 zabbix配置邮件告警
1.发邮件启动postfix /etc/init.d/postfix start mail -s @qq.com < /etc/inittab mailq 查看发送结果 2.配置发邮件文件 mk ...
- oracle对表常用的操作
最近业务需要给表添加索引,因为数据量很大时,查询效率很低:老大建议使用索引: 之前总结的时候将索引没有记录,当然啦,也怪笔者基础薄弱,不管了,慢慢进步嘛,好了进入正题吧! 首先准备工作,先建两个临时表 ...
- 伸展树(SplayTree)的实现
优点:伸展树(splay tree)是一种能自我调整的二叉搜索树(BST).虽然某一次的访问操作所花费的时间比较长,但是平摊(amortized) 之后的访问操作(例如旋转)时间能达到O(logn)的 ...
- bootstrap下,对数组循环处理的方法
nameArray和nameArrayCurrent是字符数组 $.each(nameArray, function(i, v) { if($.inArray(v, nameArrayCurrent) ...
- Agile1001社区10月份活动:一张图解读企业级产品思维
活动信息 主题:一张图解读企业级产品思维 地点:北京市海淀区苏州街3号大恒科技大厦南座4层 时间: 2017-10-15 14:00 - 17:00 报名链接:http://www.hdb.com/p ...
- Spark-Mllib中各分类算法的java实现(简易教程)
一.简述 Spark是当下非常流行的数据分析框架,而其中的机器学习包Mllib也是其诸多亮点之一,相信很多人也像我那样想要快些上手spark.下面我将列出实现mllib分类的简明代码,代码中将简述训练 ...
- MySQL数据库篇之表的增删改查
主要内容: 一.表介绍 二.创建表 三.查看表结构 四.修改表结构 五.复制表 六.删除表 1️⃣ 表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称 ...
- OPEN LDAP
一.安装OPENLDAP 安装完成后退出 编辑两个文本,输入以下内容,并把文本文件改名为ldap01.ldif和ldap02.ldif. ldap01.ldif: dn: dc=maxcrc,dc=c ...