【tyvj1860】后缀数组
后缀数组(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
输入格式
输出格式
测试样例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】后缀数组的更多相关文章
- [tyvj1860]后缀数组
题目链接:http://www.tyvj.cn/p/1860 解题关键:模板题.贴一个代码详解 http://www.cnblogs.com/staginner/archive/2012/02/02/ ...
- 后缀数组的倍增算法(Prefix Doubling)
后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- POJ1743 Musical Theme [后缀数组]
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 27539 Accepted: 9290 De ...
- 后缀数组(suffix array)详解
写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...
- 【UOJ #35】后缀排序 后缀数组模板
http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...
- 【BZOJ-2119】股市的预测 后缀数组
2119: 股市的预测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 334 Solved: 154[Submit][Status][Discuss ...
随机推荐
- hdu 2004 成绩转换
成绩转换 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- Web前端学习笔记2
一.开发工具sublime的常用快捷键. 1. 快捷键 功能 ctrl+shift+D 快速复制 ctrl+L 快 ...
- Apache Commons 简述
Apache Commons 是一个关注于可复用的 Java 组件的 Apache 项目.Apache Commons 由三部分构成: Commons Proper - 一个可复用的 Java 组件库 ...
- 【AngularJs】---Error: [$injector:modulerr] Failed to instantiate module starter.services
[遇到问题解决问题,原谅我这个菜鸟] 加了services angular.module('starter', ['ionic', 'starter.controllers', 'starter.se ...
- Remoting的入门教程
注:<网摘自http://www.codesky.net/article/200411/48322.html> 基本原理 当客户端创建远程RemotableClass的一个实例,.NET框 ...
- javascript对象初读
<script type="text/javascript"> function baseClass() { this.showMsg = function() { a ...
- asp.net字符串分割函数用法
先来看个简单的实例 但是其数组长度却是25,而不是3.下面这种方法是先将“[111cn.net]”替换成一个特殊字符,比如$,在根据这个字符执行Split 例如下面我要根据[111cn.net]分割的 ...
- Xcode6模拟器时BUG导致键盘无法弹出
Xcode 6.X版本可能会出现虚拟键盘无法调出,并在控制台出现如下提示:Can't find keyplane that supports type 5 for keyboard iPhone-Po ...
- 记redis的一个测试
现有020的系统架构走库存,取券通过Fetch前n条来实现买n张优惠券,但此做法在高并发时有严重的性能问题,性能问题主要体现在数据库. 为了优化此性能,系统改为redis,走队列模式,即生产者消费者. ...
- LINQ(LINQ to Entities)
LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...