博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ 8222 NSUBSTR(SAM)
阅读量:6986 次
发布时间:2019-06-27

本文共 1227 字,大约阅读时间需要 4 分钟。

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

推荐文章

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

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

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

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

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

#include
//SAM#include
#include
#include
#include
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
=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;}

转载地址:http://ndqpl.baihongyu.com/

你可能感兴趣的文章
练出更好的团队
查看>>
甲骨文解散Java Mission Control团队事件新进展
查看>>
一次Java字节码插桩实战
查看>>
下一代微服务!Service Mesh 2018年度总结
查看>>
知乎推荐页Ranking构建历程和经验分享
查看>>
Microsoft Edge更新:支持WebVR,使Flash可以即点即运行
查看>>
Netflix 混沌工程手册 Part 3:实践方法
查看>>
微软推出Windows Lite,目标Chrome OS上网本
查看>>
书评与摘要:Infrastructure as Code
查看>>
Better Software East/DevOps East/Agile Dev East 2016大会上的教程介绍
查看>>
深入理解浏览器的缓存机制
查看>>
详解蚂蚁金服 SOFAJRaft:生产级高性能 Java 实现
查看>>
用PVS在.NET内核中发现的缺陷
查看>>
中国在两年内赶超美国AI?李开复:不一定
查看>>
战胜阿里和腾讯,Ripple已经获得200家跨境支付客户!
查看>>
代码自解释不是不写注释的理由
查看>>
剖析AWS CodeDeploy
查看>>
首次踏入vue坑——阅读zhihudaily-vue源码
查看>>
前端开发工具——汇总篇
查看>>
Rust编程语言的核心部件
查看>>