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 (后缀自动机)相关推荐

  1. SPOJ - NSUBSTR Substrings(后缀自动机)

    题目链接:点击查看 题目大意:给出一个字符串,求出每个长度下的子串出现最多的次数 题目分析:对原串跑后缀自动机然后记录每个节点的right集合的大小就是当前节点出现的次数了,这个出现次数显然可以从子节 ...

  2. spoj 1811 LCS 后缀自动机

    A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...

  3. SPOJ 1811 LCS [后缀自动机]

    题意: 求两个串的最大连续子串 一个串建SAM,另一个串在上面跑 注意如果走了Suffix Link,sum需要更新为t[u].val+1 Suffix Link有点像失配吧,当前状态s走不了了就到S ...

  4. SPOJ 7258 SUBLEX 后缀自动机

    求第k大子串. 按拓扑序处理出一个点往后有多少条路径到终态. 答案就很明显了. #include <cstring> #include <cstdio> #define FOR ...

  5. SPOJ - SUBLEX 【后缀自动机】

    题目 求第K小子串 题解 建好SAM后,拓扑排序,反向传递后面所形成的串的数量 最后从根开始,按照儿子形成串的数量与k比较走就好了 #include<iostream> #include& ...

  6. 【SPOJ】7258. Lexicographical Substring Search(后缀自动机)

    http://www.spoj.com/problems/SUBLEX/ 后缀自动机系列完成QAQ...撒花..明天or今晚写个小结? 首先得知道:后缀自动机中,root出发到任意一个状态的路径对应一 ...

  7. 【后缀自动机】SPOJ 1812-LCSII

    题意: 给出最多10个长度不超过100000的字符串,求他们的LCS的长度.时限是鬼畜的0.25s . 后缀自动机练习...虽然有人这么说但我并不觉得hash能过. 本题可以说是[论SAM中按step ...

  8. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】

    SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...

  9. SPOJ NSUBSTR(后缀自动机)

    题目链接:http://www.spoj.com/problems/NSUBSTR/ 题目大意:给你一个字符串s(len(s)<=250000),求f[i](i=1...len(s)),其中f[ ...

最新文章

  1. 导频 matlab,v06_03_dem_2up_arrange.m 源代码在线查看 - 完美的OFDM仿真程序MATLAB(带导频),可直接运行 资源下载 虫虫电子下载站...
  2. 基于数据库数据增量同步_基于canal实现分布式数据同步
  3. SQL Server 索引结构及其使用(二)
  4. Metasploit远程调用Nessus出错
  5. 快捷技巧之一键查自己电脑所有打开的端口的具体操作
  6. 1.12 foreach循环遍历Collection集合
  7. 【小白学习C++ 教程】三、C++用户输入、判断语句和switch
  8. python创建数据库的sql语句_对python插入数据库和生成插入sql的示例讲解
  9. java 多态 降低耦合_java多态
  10. Android之提示A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
  11. “全国住房公积金”微信小程序正式上线 快速办理“异地转移”
  12. KafkaConsumer.poll : Timeout must not be negative
  13. c罗图片带字经典语言,c罗与马塞洛表情包带字
  14. php mysql索引原理_加速PHP动态网站 关于MySQL索引分析优化
  15. 【LINQ】Linq to SQL -- Where语句
  16. ps-色彩饱和度的设计
  17. 阿里云创客+千人创投会 无人机项目夺冠
  18. JAVA程序性能优化读书笔记
  19. 斗鱼封禁主播陈一发,新媒体有出路吗?
  20. 图卷积神经网络 | Python实现基于GCN-GRU图卷积门控循环单元网络模型

热门文章

  1. c#之Redis实践list,hashtable
  2. 微信网页授权功能来获取用户信息(昵称或头像)之php实现
  3. HTTP请求报文和HTTP响应报文(转载)
  4. iOS实现自定义的弹出视图(popView)
  5. wampserver2.5安装 redis缓存,igbinary, phalcon框架
  6. 神经网络总结(初稿)
  7. 中国旅游日出游火爆 中国第一水乡游人突破5万
  8. 测试机的版本高于Xcode的版本的解决方法
  9. Dubbo管理控制台的安装
  10. 4.5-4.9 磁盘格式化,磁盘挂载,手动增加swap空间