【sam复习】用sam实现后缀排序
没错,一定是无聊到一定境界的人才能干出这种事情。
这个无聊的zcysky已经不满足于用后缀平衡树求sa了,他想用sam试试。
我们回顾下sam的插入过程,如果我们从最后一个state沿着suffix link向上爬parent tree
那么我们就可以遍历这个sam的所有后缀。
那么我们把插入的时候经历的state全都标记下来,并且记录下这个state对应的序号
在对parent tree进行dfs的时候先序遍历一下就可以了。
#include<bits/stdc++.h>
#define N 300010
using namespace std;
int n,c[N],tot,tota,sacnt,top=,cnt=;
int last=,fa[N],ch[N][],l[N],vis[N],head[N];
int r[N],sa[N],rk[N],h[N];
char s[N];
struct state{int x,y,v;}q[N];
struct Edge{int u,v,next;}G[N<<];
inline void addedge(int u,int v){
G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
}
void dfs(int u){
if(r[u])sa[++sacnt]=r[u];
for(int i=head[u];i;i=G[i].next)dfs(G[i].v);
}
void ins(int c,int pos){
int p=last,np=++cnt;last=np;l[np]=l[p]+;r[np]=pos;
for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;
if(!p)fa[np]=;
else{
int q=ch[p][c];
if(l[p]+==l[q])fa[np]=q;
else{
int nq=++cnt;l[nq]=l[p]+;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q];fa[np]=fa[q]=nq;
for(;ch[p][c]==q;p=fa[p])ch[p][c]=nq;
}
}
}
int main(){
int f=;
scanf("%s",s+);n=strlen(s+);
vis[]=last=cnt=;
for(int i=n;i;i--)ins(s[i]-'a',i);
for(int i=;i<=cnt;i++)if(r[i]&&!vis[i])
for(int pos=n,j=i;!vis[j];vis[j]=,j=fa[j],--pos){
pos=pos-l[j]+l[fa[j]]+;q[++top]=(state){fa[j],j,s[pos]-'a'};
}
for(int i=;i<=top;i++)c[q[i].v]++;
for(int i=;i<;i++)c[i]+=c[i-];
for(int i=top;i;i--)rk[c[q[i].v]--]=i;
for(;top;top--)addedge(q[rk[top]].x,q[rk[top]].y);
dfs();
for(int i=;i<=n;i++)printf("%d ",sa[i]);puts("");
for(int i=;i<=n;i++)rk[sa[i]]=i;
for(int i=;i<=n;i++){
int f=max(h[rk[i-]]-,);
for(int j=sa[rk[i]-];s[i+f]==s[j+f];f++);
h[rk[i]]=f;
}
for(int i=;i<=n;i++)printf("%d ",h[i]);
}
就这样,用sam就把这题水过去了~
【sam复习】用sam实现后缀排序的更多相关文章
- LG3809 【模板】后缀排序
题意 题目背景 这是一道模板题. 题目描述 读入一个长度为 $ n $ 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的 ...
- 关于SAM和广义SAM
关于SAM和广义SAM 不是教程 某些思考先记下来 SAM 终于学会了这个东西诶...... 一部分重要性质 确定一个重要事情,S构造出的SAM的一个重要性质是当且仅当对于S的任意一个后缀,可以从1号 ...
- codevs1500 后缀排序
题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设 ...
- UOJ#35 后缀排序
这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为 ...
- P3809 【模板】后缀排序
P3809 [模板]后缀排序 从这学的 后缀数组sa[i]就表示排名为i的后缀的起始位置 x[i]是第i个元素的第一关键字 y[i]表示第二关键字排名为i的数,在第一关键字中的位置 #include& ...
- 2018.11.24 loj#111. 后缀排序(后缀数组)
传送门 后缀排序模板题. 终于会后缀数组了(然而只会倍增并不会DC3DC3DC3). 在这里列举几个数组的意思: sai:sa_i:sai:当前排名第iii的后缀的起始下标. rkirk_irki ...
- uoj35 后缀排序
题目链接:http://uoj.ac/problem/35 这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第 ...
- codevs 1500 后缀排序
codevs 1500 后缀排序 http://codevs.cn/problem/1500/ 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 天凯是MI ...
- 洛谷:P3809 【模板】后缀排序(后缀数组模板)
P3809 [模板]后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英 ...
- [洛谷P3809]【模板】后缀排序
[洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...
随机推荐
- BZOJ 1816 扑克牌(二分)
由于答案具有单调性,考虑二分答案并验证. 如果能凑齐x堆,因为每个joke在一个牌堆里最多只能用一次,则至多只能用min(x,m)个joke. 对于每个牌,如果这个牌的总数小于x,用joke补齐剩下的 ...
- Gevent-socket
1. 通过Gevent实现单线程下的多socket并发. server 端: #server side import sys import socket import time import geve ...
- 使用thymeleaf实现div中加载html
目标:固定顶部或者左侧导航,点击导航动态更新中间content区域的页面,也就是在放一个div在页面上,把html加载到div里,以前类似的实现都是通过Iframe或者js实现,在使用springbo ...
- 【以前的空间】link cut tree
这篇文章讲的很好很详细,但是写了几天后发现似乎是挺残的版本. 2049: [Sdoi2008]Cave 洞穴勘测 3282: Tree 2002: [Hnoi2010]Bounce 弹飞绵羊 1036 ...
- Android ListView 显示多种数据类型
ListView往往可能会有不同的数据类型,单类型的数据可能运用会比较少些,这也是最近项目中的一个需求{在发送消息的时候,需要选择联系人,而联系人列表由英文字母索引+联系人组成},上一篇文章只是一个基 ...
- Poco::URI
#include<iostream> #include<typeinfo> #include<Poco/Path.h> #include <Poco/Dire ...
- 理清一下JavaScript面向对象思路
借这篇文章理清一下自己的思路,同时也希望能给和我同样一知半解的同学理清一下思路.引发思考来自于我犯的一个错误,错误代码是这样的: 1 var o = { 2 ... 3 } 4 var obj ...
- A great tutorial with Jupyter notebook for ML beginners
An end to end implementation of a Machine Learning pipeline SPANDAN MADAN Visual Computing Group, Ha ...
- POJ 2226 Muddy Fields(二分匹配 巧妙的建图)
Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R ...
- 关于移动DSP
提 纲 1.移动DSP与传统营销有什么不同? 2.为什么移动DSP是大势所趋? 3.哪些因素决定移动DSP的精准与否? 4.如何辨别移动DSP的真伪优劣? 5.不同行业的广告主如何用好移动DSP? ...