这几天看了N多论文研究了下后缀自己主动机。刚開始蛋疼的看着极短的代码和clj的论文硬是看不懂,后来结合其它几篇论文研究了下。总算是明确了一些

推荐文章http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html

看了几篇文章认为还是这篇写的清晰明了,建议看几遍明确怎样建SAM再看了clj的论文。

clj的论文中对性质的研究比較深入

以下是clj论文里推荐的一题,题意:给一个字符串S,令F(x)表示S的全部长度为x的子串中,出现次数的最大值。求F(1)..F(Length(S)) (感谢clj的翻译>_<)

首先按顺序建SAM。一个串的|Right|就是出现次数。

因为父节点的Right集合正好等于子节点Right集合的并集,于是能够拓扑排序从后往前找,然后每次再把子节点的Right加到pre节点上就可以。这里拓扑排序使用了类似于计数排序的思想。见代码

#include<iostream>//SAM
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=250005<<1;
int last,tot,son[N][26],pre[N],step[N],cnt[N],Q[N],g[N],f[N];
char s[N];
void ins(int x,int m){int p=last,np=++tot;step[np]=m,last=np,g[np]++;for(;!son[p][x] && p!=-1;p=pre[p])   son[p][x]=np;if(p==-1)   return;else{int q=son[p][x];if(step[q]==step[p]+1)  pre[np]=q;else{step[++tot]=step[p]+1;int nq=tot;memcpy(son[nq],son[q],sizeof(son[q]));pre[nq]=pre[q];pre[q]=pre[np]=nq;for(;son[p][x]==q && p!=-1;p=pre[p])    son[p][x]=nq;  }}
}
int main(){pre[0]=-1;scanf("%s",s);int l=strlen(s);for(int i=0;i<l;++i)   ins(s[i]-'a',i+1);for(int i=1;i<=tot;++i) cnt[step[i]]++;for(int i=1;i<=tot;++i) cnt[i]+=cnt[i-1];for(int i=1;i<=tot;++i)   Q[cnt[step[i]]--]=i;for(int i=tot;i>=1;--i)   printf("%d\n",step[Q[i]]);for(int i=tot;i>=1;--i)    f[step[Q[i]]]=max(f[step[Q[i]]],g[Q[i]]),g[pre[Q[i]]]+=g[Q[i]];for(int i=1;i<=l;++i)  printf("%d\n",f[i]);return 0;
}

SPOJ 8222 NSUBSTR(SAM)相关推荐

  1. spoj 8222 Substrings (后缀自动机)

    spoj 8222 Substrings 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 解题思路:我们构造S的SAM,那么对于 ...

  2. SPOJ NSUBSTR(后缀自动机)

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

  3. SPOJ 7258 SUBLEX (SAM)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出一个串,查询字典序排在第k个的是哪个子串 ...

  4. SPOJ 1811 LCS,SPOJ 1812 LCS2【SAM裸题,clj的ppt很清楚

    反正clj的ppt都讲了 - LCS的话--因为只需要匹配一次,也就不需要更新pre的值了. - 然而LCS2--因为有多个字符串要匹配,于是要把整个SAM上的rec都更新了,所以多了一步从后往前更新 ...

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

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

  6. BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )

    全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries ...

  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. 洛谷 - P6292 区间本质不同子串个数(SAM+LCT+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的字符串,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 内有多少个本质不同的字符串 题目分析:首先简化模型,回顾一下如何求解 &quo ...

最新文章

  1. Android实用应用程序源码
  2. Linux 实时流量监测(iptraf中文图解)
  3. 互联网中网站建设如何体现出企业品牌的企业网络推广能力?
  4. ArcGIS Engine空间高效查询(IIdentify方法)
  5. java heap 参数_java heap space解决方法和JVM参数设置
  6. gossip 区块链_区块链中的P2P
  7. Think in AngularJS :对比 jQuery 和 AngularJS 的不同思维模式
  8. Java基础学习总结(151)——Java 8时间处理API再复习
  9. 使用selenium 驱动最新火狐浏览器出错:ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。...
  10. HDU 5971 2016ICPC大连 A: Wrestling Match(二分图判断)
  11. sphinx下的max_matches取值对SetLimits的影响
  12. flask ai 简单语音对话
  13. python做数字识别_用python实现手写数字识别
  14. 如何保留5个有效数字输出c不4舍5入_好吃好喝不发胖,这样过年才健康团
  15. Android 老生常谈之MVC与MVP
  16. 酒店标识的要求不同其设计也不同
  17. 修复 ,Ubuntu无法开机:ACPI:Error:[_SB_.PCIO.PR05.PXSX] …………
  18. vue 音乐进度条拖拽
  19. Cloud一分钟 |小米瞄上电纸书市场;员工《卫报》开专栏控诉亚马逊;拼多多Q3财报:总收入33.724亿元...
  20. 线性规划:单纯形算法之处理退化

热门文章

  1. boost::pointer_traits用法实例
  2. ITK:获取图像中标记区域的统计属性
  3. VTK:可视化算法之HyperStreamline
  4. VTK:Utilities之ArrayRange
  5. OpenCV序列化功能的实例(附完整代码)
  6. 使用OpenCV创建视频
  7. OpenGL着色器将纹理应用于全屏四边形
  8. 1.18.2.9.查询优化、Blink planner、解释表
  9. 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client
  10. Linux RedHat下安装eclipse-standard-kepler-SR1-linux-gtk.tar.gz