【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]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...
随机推荐
- html的head内标签
ctrl+?:自动注释 ctrl+/: 注释多行,再按一次,取消注释的多行. 一,*********本地测试的方法:1-找到文件路径,直接浏览器打开:2-pycharm打开测试. 二,模板的解释: ...
- CentOS scp远程拷贝
scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令, 其格式为“scp [参数] 本地文件 远程帐户@远程 IP 地址:远程目录”. 1.主要参数 -v 显示详细的连 ...
- 1923: [Sdoi2010]外星千足虫
1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1254 Solved: 799[Submit][Statu ...
- BZOJ1596 [Usaco2008 Jan]电话网络 【树形dp】
题目链接 BZOJ1596 题解 先抽成有根树 设\(f[i][0|1][0|1]\)表示以\(i\)为根,儿子都覆盖了,父亲是否覆盖,父亲是否建塔的最少建塔数 转移一下即可 #include< ...
- 如何区别java中的public,protected,default,private
================Public====================== 1>首先我们介绍public关键字,从字面意义上出发,public意为公共的,可见它的访问权限是很宽松的 ...
- [学习笔记]2-SAT 问题
(本文语言不通,细节省略较多,不适合初学者学习) 解决一类简单的sat问题. 每个变量有0/1两种取值,m个限制条件都可以转化成形如:若x为0/1则y为0/1等等(x可以等于y) 具体: 每个变量拆成 ...
- BZOJ1832 聚会
Description:Y岛风景美丽宜人,气候温和,物产丰富.Y岛上有N个城市,有N-1条城市间的道路连接着它们.每一条道路都连接某两个城市.幸运的是,小可可通过这些道路可以走遍Y岛的所有城市.神奇的 ...
- 【BZOJ 4455】 [Zjoi2016]小星星 容斥计数
dalao教导我们,看到计数想容斥……卡常策略:枚举顺序.除去无效状态.(树结构) #include <cstdio> #include <cstring> #include ...
- node egg.js使用superagent做文件转发
使用 egg.js + superagent 进行文件上传转发 // app/controller/file.js const Controller = require('egg').Controll ...
- selenium - webdriver - 设置元素等待
隐式等待:implicitly_wait(value), value默认是0 from selenium import webdriverfrom selenium.common.exceptions ...