http://uoj.ac/problem/35 (题目链接)

题意

  如题,并且求height数组。

Solution

  挂一发后缀自动机构后缀数组及height数组

细节

  注意基数排序和连边的时候不要把根节点也算进去

代码

// uoj35
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=100010;
int sa[maxn],height[maxn];
char s[maxn]; namespace SAM {
int par[maxn<<1],len[maxn<<1],r[maxn<<1],ch[maxn<<1][26],pos[maxn<<1];
int last,sz,Dargen,n,cnt;
int b[maxn],id[maxn<<1],head[maxn<<1]; struct edge {int to,next;}e[maxn<<2]; void link(int u,int v) {
e[++cnt]=(edge){v,head[u]};head[u]=cnt;
}
void Extend(int c) {
int np=++sz,p=last;last=np;
pos[np]=len[np]=r[np]=len[p]+1;
for (;p && !ch[p][c];p=par[p]) ch[p][c]=np;
if (!p) par[np]=Dargen;
else {
int q=ch[p][c];
if (len[p]+1==len[q]) par[np]=q;
else {
int nq=++sz;
len[nq]=len[p]+1;r[nq]=r[q];
memcpy(ch[nq],ch[q],sizeof(ch[q]));
par[nq]=par[q];
par[np]=par[q]=nq;
for (;p && ch[p][c]==q;p=par[p]) ch[p][c]=nq;
}
}
}
void build() {
last=sz=Dargen=1;
n=strlen(s+1);
for (int i=1;i<=n>>1;i++) swap(s[i],s[n-i+1]);
for (int i=1;i<=n;i++) Extend(s[i]-'a');
}
void dfs(int x,int l) {
if (pos[x]) sa[++sz]=n-pos[x]+1,height[sz]=l;
for (int i=head[x];i;i=e[i].next) {
if (i==head[x]) dfs(e[i].to,pos[x] ? len[x] : l);
else dfs(e[i].to,len[x]);
}
}
void pre() {
for (int i=1;i<=sz;i++) b[s[r[i]-len[par[i]]]-'a']++;
for (int i=1;i<=26;i++) b[i]+=b[i-1];
for (int i=2;i<=sz;i++) id[b[s[r[i]-len[par[i]]]-'a']--]=i;
for (int i=sz-1;i>=1;i--) link(par[id[i]],id[i]);
sz=0;dfs(1,0);
}
}
using namespace SAM; int main() {
scanf("%s",s+1);
build();
pre();
for (int i=1;i<=n;i++) printf("%d ",sa[i]);
puts("");
for (int i=2;i<=n;i++) printf("%d ",height[i]);
return 0;
}

【uoj35】 后缀排序的更多相关文章

  1. uoj35 后缀排序

    题目链接:http://uoj.ac/problem/35 这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第 ...

  2. UOJ35 后缀数组(模板)

    #35. 后缀排序 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 ...

  3. codevs1500 后缀排序

    题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设 ...

  4. UOJ#35 后缀排序

    这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为 ...

  5. P3809 【模板】后缀排序

    P3809 [模板]后缀排序 从这学的 后缀数组sa[i]就表示排名为i的后缀的起始位置 x[i]是第i个元素的第一关键字 y[i]表示第二关键字排名为i的数,在第一关键字中的位置 #include& ...

  6. LG3809 【模板】后缀排序

    题意 题目背景 这是一道模板题. 题目描述 读入一个长度为 $ n $ 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的 ...

  7. 2018.11.24 loj#111. 后缀排序(后缀数组)

    传送门 后缀排序模板题. 终于会后缀数组了(然而只会倍增并不会DC3DC3DC3). 在这里列举几个数组的意思: sai:sa_i:sai​:当前排名第iii的后缀的起始下标. rkirk_irki​ ...

  8. codevs 1500 后缀排序

    codevs 1500 后缀排序 http://codevs.cn/problem/1500/  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 天凯是MI ...

  9. 洛谷:P3809 【模板】后缀排序(后缀数组模板)

    P3809 [模板]后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英 ...

  10. [洛谷P3809]【模板】后缀排序

    [洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...

随机推荐

  1. Flutter - JSON to Dart,一个json转dart实体的网站

    如你所见,一个json转dart实体的网站,https://javiercbk.github.io/json_to_dart/

  2. 20155334 曹翔 Exp3 免杀原理与实践

    20155334 曹翔 Exp3 免杀原理与实践 小记:这次实验,困难重重,失败练练,搞得我们是心急如焚,焦头烂额,哭爹喊娘 一.基础问题回答 杀软是如何检测出恶意代码的? 每个杀软都有自己的检测库, ...

  3. FAT32文件系统学习(2) —— FAT表

    1.题外话 在继续本文学习FAT32文件系统之前,先来插入一点别的话题.我们都知道U盘有一个属性是容量,就拿笔者的U盘为例,笔者手上的U盘是金士顿的DataTraveler G3 4GB的一个U盘.电 ...

  4. Luogu P3227 [HNOI2013]切糕

    %%ZZKdalao上课讲的题目,才知道网络流的这种玄学建模 我们先想一想,如果没有D的限制,那么想当于再每一根纵轴上选一个权值最小的点再加起来 我们对应在网络流上就是每一根纵轴上的点向它下方的点用权 ...

  5. 汇编 (NOT)按位取反指令

    知识点:  (NOT)按位取反指令  逻辑取反(!)  按位取反(~)  SETZ(SETE) 取ZF位值保存  SETNZ(SETNE)将ZF位值取反后保存 一.逻辑取反(!) !111 ...

  6. 由于未能创建 Microsoft Visual C# 2008 编译器,因此未能打开项目 "..."的解决方法

    如果遇到这种问题,我们通常只要在 Visual Studio 2017 的命令提示符工具里执行下列命令即可: devenv /resetskippkgs 如果还是不行的话,可以先把 Visual St ...

  7. Linux每天一个命令:tar

    Linux tar命令简介: tar命令可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar最初被用来在磁 ...

  8. ZAB协议和Paxos算法

    前言在上一篇文章Paxos算法浅析中主要介绍了Paxos一致性算法应用的场景,以及对协议本身的介绍:Google Chubby是一个分布式锁服务,其底层一致性实现就是以Paxos算法为基础的:但这篇文 ...

  9. 批处理修改Hosts文件

    @echo off set stHosts=127.0.0.1 www.XXX.com FOR /F "eol=# tokens=1 delims=" %%i in (%Syste ...

  10. allegro 基本步骤

    PCB 1.建立电路板 首先是打开PCB编辑器——开始--所有程序-- Allegro SPB 15.5--PCB Editor,在弹出的对话框中选择Allegro PCB Design 610(PC ...