【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 ...
随机推荐
- oracle 中将字符转换为blob 类型
示例如下: select id,mblx,mbmc,TO_BLOB(UTL_RAW.CAST_TO_RAW(mbsj))mbsj,qyid,qycode from tempuser.temp_cwht ...
- centos 安装ss-QT5
方法一(DNF指令): 1.如果未安装DNF,请跳转至:http://dev.fjuts.com:83/blog/index.PHP/Linux/261.html2.添加shadowsocks 的 c ...
- 【转】十二个移动App云测试服务盘点
随着移动设备.操作系统版本的碎片化,测试工作对于移动开发团队而言越来越成为一个沉重的包袱,不过这也带来了商机,现在市场上有不少服务和平台提供云测试工具,可以对移动App进行自动化测试,提供测试报告和优 ...
- C# 实现远程控制软件的关键技术
一.服务器端多线程Socket技术 用TcpListener进行侦听,接受客户端连接,有客户端连进来后开启处理线程处理数据,代码如下: using System; using System ...
- Sublime Text—安装
一.简介 市面上的编辑器纷繁复杂各有优点,好用的编辑器能让你工作事半功倍,先简单介绍下本文主角Sublime Text编辑器,下面简称Sublime. 1.可用于 Windows.Mac OS X 和 ...
- ActiveMQ(5.10.0) - Connection Configuration URI
An Apache ActiveMQ connection can be configured by explicitly setting properties on the ActiveMQConn ...
- Jersey(1.19.1) - Conditional GETs and Returning 304 (Not Modified) Responses
Conditional GETs are a great way to reduce bandwidth, and potentially server-side performance, depen ...
- Objective-C(iOS)严格单例模式正确实现
注:本文所有权归作者所有,转载请注明出处 当希望在一个应用程序中某个类的对象只能存在一个的时候就可以考虑用单例模式来实现,单例模式在C++中比较容易实现(只需把构造函数声明为private),而在Ob ...
- Poj 3117 World Cup
1.Link: http://poj.org/problem?id=3117 2.Content: World Cup Time Limit: 1000MS Memory Limit: 65536 ...
- SQL语句基本概念
星期五 2014年11月21日 SQL语句: sql语句用于检索维护数据库中的数据 [ create alter Select update ...