描述
我们定义一个字符串的后缀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. poj 3264 RMQ

    直接写个RMQ就能过. #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  2. iOS开发者如何提高自己的水平(转)

    阅读. 把一大堆的知识塞进脑子里.随着时间流逝,终归有一些会留在脑海里.我觉得有些东西读起来还挺有意思,那么也能算作一种愉快的消遣. 分析. 多去熟悉并了解一些工具,从高层的到底层的,不要害怕去使用他 ...

  3. MongoDB - Installing MongoDB on Windows

    1. 在 http://www.mongodb.org/downloads 选择下载所需的版本. 2. 执行 msi 安装包,可通过 Custom 选项,选择安装目录. 3. 创建数据目录.Mongo ...

  4. 参数请求post, get , delete中的基本使用(2)

    UTF-8数字编码 /// <summary> /// 参数的Url请求 /// </summary> /// <returns></returns> ...

  5. ASP.NET播客(留言时间,投票IP,留言限字数,上传视频)

    留言发布时间功能: 界面: 前台代码: 在Datalist控件中: 在<%#getIsDate(Convert.ToString(Eval("issuanceDate"))) ...

  6. Android之标签选项卡

    TabWidget可以通过不同的标签进行切换并且显示不同的内容,相当于Button按钮实现不同的功能. TabHost的布局: (1):我们先在Layouts拖一个Vertical(纵向视图)的Lin ...

  7. TSQL基础(二)

    over() 开窗函数 排名函数必须和over()一起使用,所以先了解over(). OVER 子句定义查询结果集内的窗口或用户指定的行集. 然后,开窗函数将计算窗口中每一行的值. 您可以将 OVER ...

  8. 解决TextView在显示文字的时候,一行还没显示满就跳到下一行

    转载请注明:转自 http://blog.csdn.NET/u011176685/article/details/48295185 一.问题描述: Android的TextView在显示文字的时候,如 ...

  9. sass最佳实践

    sass 变量 可以实现统一的布局,比如统一的内边距,统一的外边距,统一的颜色,统一的字号. 嵌套 可以根据组件的嵌套方式来嵌套css代码,方便收缩,查找.代码结构非常清晰,有利于以组件的方式开发 混 ...

  10. GDI+

    1, 编译error的话一般是却 #include <comdef.h>#include <Windows.h> Windows.h内会包含Windows.h,但是因为在std ...