Uoj #35. 后缀排序(后缀数组)
35. 后缀排序
统计
描述
提交
自定义测试
这是一道模板题。
读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置。位置编号为 11 到 nn。
除此之外为了进一步证明你确实有给后缀排序的超能力,请另外输出 n−1n−1 个整数分别表示排序后相邻后缀的最长公共前缀的长度。
输入格式
一行一个长度为 nn 的仅包含小写英文字母的字符串。
输出格式
第一行 nn 个整数,第 ii 个整数表示排名为 ii 的后缀的第一个字符在原串中的位置。
第二行 n−1n−1 个整数,第 ii 个整数表示排名为 ii 和排名为 i+1i+1 的后缀的最长公共前缀的长度。
样例一
input
ababa
output
5 3 1 4 2
1 3 0 2
explanation
排序后结果为:
a
aba
ababa
ba
baba
限制与约定
1≤n≤1051≤n≤105
时间限制:1s1s
空间限制:256MB256MB
/*
求height裸题.
数组从0开始有一个点过不去
然后改了从1开始,改了好久。。
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#define MAXN 100001
using namespace std;
int n,m=130,s[MAXN],sa[MAXN],ht[MAXN],rank[MAXN],t1[MAXN],t2[MAXN],c[MAXN];
char ch[MAXN];
bool cmp(int *y,int a,int b,int k)
{
int a1=y[a],b1=y[b];
int a2=a+k>n?-1:y[a+k];
int b2=b+k>n?-1:y[b+k];
return a1==b1&&a2==b2;
}
void slovesa()
{
int *x=t1,*y=t2;
for(int i=1;i<=n;i++) c[x[i]=s[i]]++;
for(int i=2;i<m;i++) c[i]+=c[i-1];
for(int i=n;i>=1;i--) sa[c[x[i]]--]=i;
for(int k=1,p=0;k<=n;k<<=1,m=p+1,p=0)
{
for(int i=n-k+1;i<=n;i++) y[++p]=i;
for(int i=1;i<=n;i++) if(sa[i]>k) y[++p]=sa[i]-k;
for(int i=0;i<m;i++) c[i]=0;
for(int i=1;i<=n;i++) c[x[y[i]]]++;
for(int i=2;i<m;i++) c[i]+=c[i-1];
for(int i=n;i>=1;i--) sa[c[x[y[i]]]--]=y[i];
swap(x,y);x[sa[1]]=1,p=1;
for(int i=2;i<=n;i++)
{
if(cmp(y,sa[i-1],sa[i],k)) x[sa[i]]=p;
else x[sa[i]]=++p;
}
if(p>n) break;
}
}
void sloveheight()
{
int k=0;
for(int i=1;i<=n;i++) rank[sa[i]]=i;
for(int i=1;i<=n;ht[rank[i++]]=k)
{
int j=sa[rank[i]-1];
if(k) k--;
while(j+k<=n&&i+k<=n&&s[j+k]==s[i+k]) k++;
}
ht[1]=0;
}
int main()
{
scanf("%s",ch+1);n=strlen(ch+1);
for(int i=1;i<=n;i++) s[i]=ch[i];
slovesa(),sloveheight();
for(int i=1;i<=n;i++) printf("%d ",sa[i]);
printf("\n");
for(int i=2;i<=n;i++) printf("%d ",ht[i]);
return 0;
}
Uoj #35. 后缀排序(后缀数组)的更多相关文章
- 【UOJ #35】后缀排序 后缀数组模板
http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...
- UOJ #35. 后缀排序[后缀数组详细整理]
#35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...
- 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记
题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...
- Codevs 1500 后缀排序(后缀数组)
1500 后缀排序 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个 ...
- UOJ #35. 后缀排序 后缀数组 模板
http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. #include<ios ...
- UOJ.35.[模板]后缀排序(后缀数组 倍增)
题目链接 论找到一个好的教程的正确性.. 后缀数组 下标从1编号: //299ms 2560kb #include <cstdio> #include <cstring> #i ...
- [UOJ#35] [UOJ后缀数组模板题] 后缀排序 [后缀数组模板]
后缀数组,解决字符串问题的有利工具,本题代码为倍增SA算法 具体解释详见2009年国家集训队论文 #include <iostream> #include <algorithm> ...
- luogu3809 后缀排序 后缀数组
ref and 挑战程序设计竞赛. 主要是发现自己以前写得代码太难看而且忘光了,而且我字符串死活学不会啊,kmp这种东西我都觉得是省选+难度啊QAQ #include <iostream> ...
- Luogu P3809 【模板】后缀排序(后缀数组板题)
忘完了- emmm-
随机推荐
- 用PHP写PHP7扩展,超级简单对吧!
[图片打不开,请用代理] 介绍: PHP扩展是编译库,它允许在您的PHP代码中使用特定的功能(主要是使用C编写的php扩展). 例如,您需要使用PHP使用SQLite3,您可以实现自己的方法和功能来连 ...
- Part_six:Redis-cluster 实现集群
redis-cluster 1.并发问题 redis官方生成可以达到 10万/每秒,每秒执行10万条命令 假如业务需要每秒100万的命令执行呢? 2.客户端分片 redis3.0集群采用P2P模式,完 ...
- Oracle 创建数据表
数据库中的每一个表都被一个模式(或用户)所拥有,因此表是一种典型的模式对象.在创建数据表时,Oracle 将在一个指定的表空间中为其分配存储空间.最初创建的表时一个空的逻辑存储结构,其中不包含任何数据 ...
- Eclipse - servlet显示无法导入javax.servlet包问题的解决方案
项目名-->右键 Property-->选择 Java Build Path-->选择 Add External JARs-->选择 把servlet-api.jar的路径输入 ...
- TP5配置隐藏入口index.php文件,Apache/phpstudy
一,找到/public/.htaccess文件,如果你的入口文件已经移动到根目录下,那么你的.htaccess文件也要剪切到根目录下,总之要确保.htaccess跟入口的index.php保持同级. ...
- 编译安装php服务报错问题:configure: error: Cannot find libmysqlclient under /usr.
在编译安装php服务时报错: checking for MSSQL support via FreeTDS... nochecking for MySQL support... yeschecking ...
- 尚硅谷韩顺平Linux教程学习笔记
目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...
- 碰到的TypeError--记录
TypeError: object of type 'Response' has no len() 我在写爬虫的时候,通过requests获取到了网址的html文件,一开始是用content保存下 ...
- winform上传文件到服务器——资料整理
标题:使用简单的wcf文件实现上传,下载文件到服务器 地址:https://blog.csdn.net/duanzi_peng/article/details/19037777
- CentOS7 yum方式 安装mysql 5.7.28步骤
CentOS7系统yum方式安装MySQL5.7 最新的yum源可以去http://dev.mysql.com/downloads/repo/yum下载 1.获取mysql官方yum reposito ...