描述
我们定义一个字符串的后缀suffix(i)表示从s[i]到s[length(s)]这段子串。
后缀数组(Suffix array)SA[i]中存放着一个排列,满足suffix(sa[i])<suffix(sa[i+1]) 按照字典序方式比较
定义height[i]表示suffix(sa[i])与suffix(sa[i-1])之间的最长公共前缀长度,其中height[1]=0
你的任务就是求出SA和height这两个数组。字符串长度<=200000

输入格式

一行,为描述中的字符串(仅会出现小写字母)

输出格式

共两行,每行n个数,第一行为sa[i],第二行为height[i],其中每行的数均用空格隔开

测试样例1

输入

aabaaaab

输出

4 5 6 1 7 2 8 3 
0 3 2 3 1 2 0 1

题目告诉我们这是一个模板题,这的确就是一个模板题,geth函数还不是太理解。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<set>
#include<ctime>
#include<vector>
#include<cmath>
#include<algorithm>
#include<map>
#define inf 2000000000
#define N 200005
int n;
char ch[N];
int a[N],h[N];
int v[N];
int sa[][N],rk[][N];
int p,q,k;
void init(){
scanf("%s",ch+);
n=strlen(ch+);
for (int i=;i<=n;i++) a[i]=ch[i]-'a'+;
} void change(int sa[N],int rk[N],int SA[N],int RK[N]){
for (int i=;i<=n;i++) v[rk[sa[i]]]=i;//该排名最后出现的位置
for (int i=n;i>=;i--) if (sa[i]>k)
SA[v[rk[sa[i]-k]]--]=sa[i]-k;//sa[i]-k代表一个字符串
for (int i=n-k+;i<=n;i++) SA[v[rk[i]]--]=i;//?
for (int i=;i<=n;i++) RK[SA[i]]=RK[SA[i-]]+(rk[SA[i-]]!=rk[SA[i]]||rk[SA[i-]+k]!=rk[SA[i]+k]); } void work(){
q=,p=;
for (int i=;i<=n;i++) v[a[i]]++;
for (int i=;i<=;i++)v[i]+=v[i-];
for (int i=;i<=n;i++) sa[p][v[a[i]]--]=i;
for (int i=;i<=n;i++) rk[p][sa[p][i]]=(rk[p][sa[p][i-]])+(a[sa[p][i-]]!=a[sa[p][i]]);
k=;
while (k<n){
change(sa[p],rk[p],sa[q],rk[q]);
p^=;q^=;k=k<<;
}
for (int i=;i<=n;i++) printf("%d ",sa[p][i]);
} void geth(){
int k=;
for (int i=;i<=n;i++)
if (rk[p][i]==)h[rk[p][i]]=;
else{
int j=sa[p][rk[p][i]-];
while (a[i+k]==a[j+k])k++;
h[rk[p][i]]=k;if (k>)k--;
}
} int main(){
init();
work();
geth();
puts("");
for(int i=;i<=n;i++)printf("%d ",h[i]);
}

【tyvj1860】后缀数组的更多相关文章

  1. [tyvj1860]后缀数组

    题目链接:http://www.tyvj.cn/p/1860 解题关键:模板题.贴一个代码详解 http://www.cnblogs.com/staginner/archive/2012/02/02/ ...

  2. 后缀数组的倍增算法(Prefix Doubling)

    后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...

  3. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  4. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  5. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  6. POJ1743 Musical Theme [后缀数组]

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 27539   Accepted: 9290 De ...

  7. 后缀数组(suffix array)详解

    写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...

  8. 【UOJ #35】后缀排序 后缀数组模板

    http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...

  9. 【BZOJ-2119】股市的预测 后缀数组

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 334  Solved: 154[Submit][Status][Discuss ...

随机推荐

  1. 转: utf16编码格式(unicode与utf16联系)

    转自: http://www.cnblogs.com/dragon2012/p/5020259.html UTF-16是Unicode字符集的一种转换方式,即把Unicode的码位转换为16比特长的码 ...

  2. fatal error LNK1168: cannot open Debug/opreat.exe for writing

    问题:LINK : fatal error LNK1168: cannot open Debug/opreat.exe for writing           Error executing li ...

  3. Linux 命令 - route: 显示或操作路由表

    route 命令查看路由表或者手动地添加.删除和修改路由表中的条目. 命令格式 route [-CFvnNee] [-A family] route [-v] [-A family] add [-ne ...

  4. get方法与post方法的使用

    使用get方法获取页面的form内容 新建一个getform.html <html> <head> <title>Using Http Get Method< ...

  5. ios Swift 之github

    1. 软件类 a) 作者集合 http://nondot.org/sabre/ b) swift for facebook SWIFT是一个易于使用的,基于注解的Java来创建勤俭节约序列化类型和服务 ...

  6. poj 3237 Tree

    就是简单的树链剖分,但标记下传的时候一定要 ^1 而不能直接 = 1,我竟然WA在这么逗比的错误上不如一头撞死…… 上代码: #include <cstdio> #include < ...

  7. 2014-10 u-boot make xxx_defconfig 过程分析

    /** ****************************************************************************** * @author    Maox ...

  8. 译文:Javascript-Functions

    个人理解+google翻译+有道翻译.如有错误,请指正.原文来自MDN:Functions Functions是javascript基本构建模块之一.每一个function是一个javascript程 ...

  9. php总结:1.php介绍

    1.什么是php PHP,即“Hypertext Preprocessor”,是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中去.它的语法利用了 C.Java 和 P ...

  10. 记一个JAVA关于日期的坑

    JAVA解析日期格式代码,之前一直写成:“yyyy-MM-dd hh:mm”,比如"2016-01-18 11:00"."2016-01-18 15:00"都可 ...