UOJ#35 —— 后缀排序
1、题目大意:后缀数组模板题
2、分析:汝佳的书上的代码的有bug,还有那个n是字符串长度+1,‘’也要加入排序的
存个模板QAQ
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
char s[101000];
int sa[101000], t[101000], t2[101000], c[101000];
int Rank[101000], height[101000];
inline void build_sa(int m){
int *x = t, *y = t2;
int n = strlen(s) + 1;
for(int i = 0; i < m; i ++) c[i] = 0;
for(int i = 0; i < n; i ++) c[x[i] = s[i]] ++;
for(int i = 1; i < m; i ++) c[i] += c[i - 1];
for(int i = n - 1; i >= 0; i --) sa[-- c[x[i]]] = i;
for(int k = 1; k <= n; k <<= 1){
int p = 0;
for(int i = n - k; i < n; i ++) y[p ++] = i;
for(int i = 0; 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 = 0; i < n; i ++) c[x[y[i]]] ++;
for(int i = 0; i < m; i ++) c[i] += c[i - 1];
for(int i = n - 1; i >= 0; i --) sa[-- c[x[y[i]]]] = y[i];
swap(x, y);
p = 1; x[sa[0]] = 0;
for(int i = 1; i < n; i ++){
if(y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + k] == y[sa[i] + k]) x[sa[i]] = p - 1;
else x[sa[i]] = p ++;
}
if(p >= n) break;
m = p;
}
for(int i = 1; i < n; i ++) printf("%d ", sa[i] + 1);
printf("\n");
return;
}
inline void getHeight(){
int k = 0;
int n = strlen(s) + 1;
for(int i = 0; i < n; i ++) Rank[sa[i]] = i;
for(int i = 0; i < n; i ++){
if(k) k --;
if(!Rank[i]) continue;
int j = sa[Rank[i] - 1];
while(s[i + k] == s[j + k] && i + k < n && j + k < n) k ++;
height[Rank[i]] = k;
}
for(int i = 2; i < n; i ++) printf("%d ", height[i]);
printf("\n");
}
int main(){
scanf("%s", s);
build_sa(300);
getHeight();
return 0;
}
UOJ#35 —— 后缀排序的更多相关文章
- UOJ #35. 后缀排序[后缀数组详细整理]
#35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...
- Uoj #35. 后缀排序(后缀数组)
35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在 ...
- UOJ#35 后缀排序
这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为 ...
- UOJ #35. 后缀排序 后缀数组 模板
http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. #include<ios ...
- UOJ #35 后缀排序 哈希做法
题面 http://uoj.ac/problem/35 题解 后缀数组当然可以 这里用哈希做 首先排序的问题在哪里 在于比较两个后缀的复杂度是O(length)的 但是我们可以通过找LCP来优化比较 ...
- 【后缀数组】uoj#35. 后缀排序
模板 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #de ...
- uoj#35 后缀排序(后缀数组模版)
#include<bits/stdc++.h> #define N 100005 using namespace std; char s[N]; int a[N],c[N],t1[N],t ...
- UOJ 35 后缀数组
后缀数组裸题,求排名第1~n的后缀,想相邻后缀的最长公共前缀. 集训队模板就是硬lO(∩_∩)O哈哈~ #include <cstdio> #include <cmath> # ...
- 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记
题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...
随机推荐
- 之前总结的今天给大分享一下iOS
退回输入键盘 苹果 ios 开发一年的工作笔记 - (BOOL) textFieldShouldReturn:(id)textField{ [textField resignFirstResponde ...
- 日志分析 第四章 安装filebeat
在进行前面准备之后可以开始安装了,我们的安装顺序是filebeat--->logstash--->elasticsearch filebeat安装很简单,先下载filebeat,这里我们使 ...
- Java查找算法——二分查找
import java.lang.reflect.Array; import java.nio.Buffer; import java.util.Arrays; import java.util.Ra ...
- linux curl 命令详解,以及实例
linux curl是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称url为下载工具. 一,curl命令参数,有好多我没有用过,也不知道翻 ...
- haproxy安装
最近一直在整理之前用过的东西,现在到haproxy了,安装如下: tar xf haproxy-1.4.27.tar.gz cd haproxy-1.4.27 make TARGET=linux26 ...
- Simple colum formatting in Yii 2 GridView
A very important widget in the business apps development is the GridView control. In this post I wil ...
- Ubuntu 源码安装 nginx 1.9.2
安装前准备: //更新系统 1.sudo apt-get update //安装pcre包 2.sudo apt-get install libpcre3 libpcre3-dev 3.sudo ...
- RPC-远程过程调用协议
远程过程调用协议 同义词 RPC一般指远程过程调用协议 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要 ...
- Eclipse插件checkstyle安装使用
方法一: 1.Eclipse中,选择Help->Software Updates->Find and Install 2.选择 Search for new features to ...
- android自定义控件(1)-点击实现开关按钮切换
自定义控件的步骤.用到的主要方法: 1.首先需要定义一个类,继承自View:对于继承View的类,会需要实现至少一个构造方法:实际上这里一共有三个构造方法: public View (Contex ...