这几天看了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 NSUBSTR 求长度为x的子串中出现次数最大值 SAM

    题目大意 给一个字符串S 令F(x)表示S的所有长度为x的子串中 出现次数的最大值. 求F(1)..F(Length(S)) 分析 一个节点\(x\)的长度有\(~~(max(fa),max(x)]\ ...

  2. ●SPOJ 8222 NSUBSTR–Substrings

    题链: http://www.spoj.com/problems/NSUBSTR/题解: 后缀自动机. 不难发现,对于自动机里面的一个状态s, 如果其允许的最大长度为maxs[s],其right集合的 ...

  3. ●SPOJ 8222 NSUBSTR–Substrings(后缀自动机)

    题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 后缀自动机的水好深啊!懂不了相关证明,带着结论把这个题做了.看来这滩深水要以后再来了. 本题要用到一个叫 R ...

  4. ●SPOJ 8222 NSUBSTR - Substrings(后缀数组)

    题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 同届红太阳 --WSY给出的后缀数组解法!!! 首先用倍增算法求出 sa[i],rak[i],hei[i]然 ...

  5. SPOJ 8222 NSUBSTR - Substrings

    http://www.spoj.com/problems/NSUBSTR/ 题意: F(x)定义为字符串S中所有长度为x的子串重复出现的最大次数 输出F[1]~F[len(S)] 用字符串S构建后缀自 ...

  6. 【刷题】SPOJ 8222 NSUBSTR - Substrings

    You are given a string S which consists of 250000 lowercase latin letters at most. We define F(x) as ...

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

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

  8. SPOJ 8222 Substrings(后缀自动机)

    [题目链接] http://www.spoj.com/problems/NSUBSTR/ [题目大意] 给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值. 求出所有的F. [题 ...

  9. 【SPOJ 8222】Substrings

    http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...

随机推荐

  1. Linux命令之gdisk

    gdisk -l [设备] gdisk又叫GPT fdisk,算是fdisk的延伸吧,主要使用的是GPT分区类型,用来划分容量大于2T的硬盘. 扩展1:分区类型GPT和MBR.GPT最大支持18EB( ...

  2. asp.net core集成MongoDB

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...

  3. 【centos 7】搭FTP服务和web访问

    步骤:安装 vsftpd-->增加用户-->配置vsftpd和用户权限 -->配置iptables 安装httpd,开放http访问 /var/tmp/user1下目录 1.安装和用 ...

  4. dp洋洋散散的知识+code

    /*在数轴上有0-N的位置 从0出发每次可以向右走 2 23 233步*/ // 1 总共的方案数 f[i]=f[i-]+f[i-]+f[i-]; f[]=; ;a<=n;a++) { ) f[ ...

  5. [BZOJ4311]向量(凸包+三分+线段树分治)

    可以发现答案一定在所有向量终点形成的上凸壳上,于是在上凸壳上三分即可. 对于删除操作,相当于每个向量有一个作用区间,线段树分治即可.$O(n\log^2 n)$ 同时可以发现,当询问按斜率排序后,每个 ...

  6. 【lct】poj2763 Housewife Wind

    题意:给你一棵树,边带权,支持两种操作:修改某条边的权值:查询两点之间的最短路. lct主要实现单点修改和路径和. 修改x结点的值只需将x Splay到其所在辅助树的根,然后修改其值,再maintai ...

  7. dcoker常用命令

    记录一下常用的命令 docker run -t -i  xxxx /bin/bash 运行容器的交互会话shell docker start xxxx 启动容器 docker stop xxxx 停止 ...

  8. bzoj 1018 线段树维护连通性

    本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...

  9. fpdf中文乱码,添加字符集

    中文乱码 引入Olivier的chinese.php(点击下载) 支持中文,其中有Big5,GB两种 使用方法也很简单 $pdf->AddBig5Font(); $pdf->SetFont ...

  10. Codeforces Round #305 (Div. 1) A. Mike and Frog 暴力

     A. Mike and Frog Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/547/pr ...