spoj 8222 Substrings (后缀自动机)
题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值。求F(1)..F(Length(S))
解题思路:我们构造S的SAM,那么对于一个节点s,它的长度范围是[Min(s),Max(s)],同时他的出现次数是|Right(s)|。那么我们用|Right(s)|去更新F(Max(s))的值。那么现在的问题是如何快速求 |right(s)| 了还记得论文里parent tree吗?看看那个就知道了,不懂可以留言。接下来还有一步,我们现在只更新了节点代表串长度的f[l],那介于 s->len 和 s->fa->len的长度的那些串怎么办呢?好办,我们从长往短dp推下来就可以了,因为长的串出现了,短的必然出现了,比如长为4的出现了5次,那么长为3,2,1的必然至少出现5次,这样就把[s->len,s->fa->len]区间的也都更新进去了。(另外这题数据好弱。。我把字符范围误打成0->10都过了,侥幸排在了第一!!!)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std ; const int maxn = 250005 ; int fa[maxn<<2] , c[26][maxn<<2] , val[maxn<<2] ;
int last , tot ;
int f[maxn] , g[maxn<<2] ; int max ( int a , int b ) { return a > b ? a : b ; } inline int new_node ( int step ) {
int i ;
val[++tot] = step ;
for ( i = 0 ; i < 26 ; i ++ ) c[i][tot] = 0 ;
fa[tot] = 0 ;
return tot ;
} void add ( int k ) {
int p = last , i ;
int np = new_node ( val[p] + 1 ) ;
while ( p && !c[k][p] ) c[k][p] = np , p = fa[p] ;
if ( !p ) fa[np] = 1 ;
else {
int q = c[k][p] ;
if ( val[q] == val[p] + 1 ) fa[np] = q ;
else {
int nq = new_node ( val[p] + 1 ) ;
for ( i = 0 ; i < 26 ; i ++ ) c[i][nq] = c[i][q] ;
fa[nq] = fa[q] ;
fa[np] = fa[q] = nq ;
while ( p && c[k][p] == q ) c[k][p] = nq , p = fa[p] ;
}
}
last = np ;
} void init () {
tot = 0 ;
last = new_node ( 0 ) ;
} char s[maxn] ;
int pos[maxn<<2] , ws[maxn<<2] ;
int main () {
while ( scanf ( "%s" , s ) != EOF ) {
init () ;
int i , len = strlen ( s ) ;
for ( i = 0 ; i < len ; i ++ ) add ( s[i] - 'a' ) ;
for ( i = 1 ; i <= tot ; i ++ ) ws[i] = 0 ;
for ( i = 1 ; i <= tot ; i ++ ) ws[val[i]] ++ ;
for ( i = 1 ; i <= tot ; i ++ ) ws[i] += ws[i-1] ;
for ( i = 1 ; i <= tot ; i ++ ) pos[ws[val[i]]--] = i ;
for ( i = 1 ; i <= tot ; i ++ ) g[i] = 0 ;
for ( i = 1 ; i <= len ; i ++ ) f[i] = 0 ;
int p = 1 ;
for ( i = 0 ; i < len ; i ++ ) g[p=c[s[i]-'a'][p]] ++ ;
for ( i = tot ; i >= 1 ; i -- ) {
p = pos[i] ;
f[val[p]] = max ( f[val[p]] , g[p] ) ;
g[fa[p]] += g[p] ;
}
for ( i = len - 1 ; i >= 1 ; i -- )
f[i] = max ( f[i] , f[i+1] ) ;
for ( i = 1 ; i <= len ; i ++ )
printf ( "%d\n" , f[i] ) ;
}
}
spoj 8222 Substrings (后缀自动机)的更多相关文章
- 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上 ...
- ●SPOJ 8222 NSUBSTR–Substrings(后缀自动机)
题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 后缀自动机的水好深啊!懂不了相关证明,带着结论把这个题做了.看来这滩深水要以后再来了. 本题要用到一个叫 R ...
- SPOJ 8222. Substrings(后缀自动机模板)
后缀自动机+dp. 后缀自动机主要是在functioner大牛那里学习的:http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html 这道题是在No_st ...
- Substrings SPOJ - NSUBSTR (后缀自动机)
Substrings \[ Time Limit: 100ms\quad Memory Limit: 1572864 kB \] 题意 给出一个长度为 \(250000\) 的字符串,求出所有 \(x ...
- POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀自动机)
题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 确实比后缀数组快多了(废话→_→). \(Description\) 求两个字符串最长公共子串 ...
- 【CF316G3】Good Substrings 后缀自动机
[CF316G3]Good Substrings 题意:给出n个限制(p,l,r),我们称一个字符串满足一个限制当且仅当这个字符串在p中的出现次数在[l,r]之间.现在想问你S的所有本质不同的子串中, ...
- Lexicographical Substring Search SPOJ - SUBLEX (后缀自动机)
Lexicographical Substrings Search \[ Time Limit: 149 ms \quad Memory Limit: 1572864 kB \] 题意 给出一个字符串 ...
随机推荐
- 调用Windows属性窗口(居然是通过注册表来调用的)
简述 在Windows系统下.可以通过:右键 -> 属性,来查看文件/文件夹对应的属性信息,包括:常规.安全.详细信息等. 简述 共有类型 共有类型 首先,需要包含头文件: #include & ...
- winform,wpf全屏 还显示任务栏的解决方法
原文:winform,wpf全屏 还显示任务栏的解决方法 以wpf为例: 全屏代码: this.Topmost = true; this.WindowStyle = System.Windows.Wi ...
- C++之单元测试
以前编写程序从没有做过单元测试的工作,所以在后期会花很多时间去纠错,这也就是软件工程中的2:8定律.最近要完成一个项目,要求要对系统中的主类和主函数作出单元测试的保证,才去查找了相关方面的资料,看过后 ...
- 28 个 Unix/Linux 的命令行神器
28 个 Unix/Linux 的命令行神器 下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具(原文链接),有一些是大家熟悉的,有一些是非常有用的,有一些 ...
- [转]JSOM绘制地图区块及航道路径
From :http://support.sailstech.com/kb/c73fd2405d79911253e568ccdc69256dc7c8fb5c/josm 步驟一: 使用JOSM繪製地圖區 ...
- 【LeetCode练习题】Multiply Strings
Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...
- lamp apache配置虚拟主机
You don't have permission to access /index.php on this server
- LSH、ITQ、SKLSH图像检索实验实现(包含源码下载地址)
原文来自我的独立blog:http://www.yuanyong.org/blog/cv/lsh-itq-sklsh-compliment 这两天寻找idea,想来思去也没想到好点的方法,于是把前段时 ...
- Android的读写文件权限
设置文件生成的权限: public static boolean saveInfo( Context context, String userName, String userPass, int mo ...
- C#打印条码BarTender SDK打印之路和离开之路(web平凡之路)
从来没想过自己会写一篇博客,鉴于这次从未知的探索到一个个难点的攻破再到顺利打印,很想记录这些点滴,让后人少走弯路. 下面走进正题. 需求:取数据库里的相应的字段数据,并生成条形码,可以批量.单条打印. ...