洛谷-P3809-后缀排序(后缀数组)
看了求后缀数组的倍增法之后很快就理解了,但是自己写的倍增法用map排序还是超时了。然后看了两天别人写的模板,题目是通过了,但感觉代码还是半懂半背的。以后多熟悉熟悉吧;
- 后缀数组
#include "bits/stdc++.h"
using namespace std;
const int MAXN = 1e6 + ;
char s[MAXN];
int sa[MAXN], rk[MAXN], height[MAXN];
void getSa(char* s, int* sa, int n, int m) {
int* x = (int*)calloc(MAXN, sizeof(int));
int* y = (int*)calloc(MAXN, sizeof(int));
int* cnt = (int*)calloc(MAXN, sizeof(int));
for (int i = ; i <= n; i++) {
cnt[x[i] = s[i]]++;
}
for (int i = ; i <= m; i++) {
cnt[i] += cnt[i - ];
}
for (int i = n; i; i--) {
sa[cnt[x[i]]--] = i;
}
for (int j = ; j < n; j <<= ) {
int num = ;
for (int i = n - j + ; i <= n; i++) {
y[++num] = i;
}
for (int i = ; i <= n; i++) {
if (sa[i] > j) {
y[++num] = sa[i] - j;
}
}
for (int i = ; i <= m; i++) {
cnt[i] = ;
}
for (int i = ; i <= n; i++) {
cnt[x[i]]++;
}
for (int i = ; i <= m; i++) {
cnt[i] += cnt[i - ];
}
for (int i = n; i; i--) {
sa[cnt[x[y[i]]]--] = y[i];
}
swap(x, y);
x[sa[]] = num = ;
for (int i = ; i <= n; i++) {
if (y[sa[i]] != y[sa[i - ]] || y[sa[i] + j] != y[sa[i - ] + j]) {
x[sa[i]] = ++num;
} else {
x[sa[i]] = num;
}
}
if (num >= n) {
break;
}
m = num;
}
free(x);
free(y);
free(cnt);
}
void getHeight(char* s, int* sa, int* rk, int* height, int n) {
for (int i = ; i <= n; i++) {
rk[sa[i]] = i;
}
int k = ;
for (int i = ; i <= n; i++) {
k = k != ? k - : k;
int j = sa[rk[i] - ];
while (s[i + k] == s[j + k]) {
k++;
}
height[rk[i]] = k;
}
}
int main() {
gets(s + );
int len = strlen(s + );
getSa(s, sa, len, );
// getHeight(s, sa, rk, height, len);
for (int i = ; i < len; i++) {
printf("%d ", sa[i]);
}
printf("%d\n", sa[len]);
/*
for (int i = 1; i < len; i++) {
printf("%d ", rk[i]);
}
printf("%d\n", rk[len]);
for (int i = 1; i < len; i++) {
printf("%d ", height[i]);
}
printf("%d\n", height[len]);
*/
return ;
}附带rank数组和height数组,本题不需要。
洛谷-P3809-后缀排序(后缀数组)的更多相关文章
- [洛谷P3809]【模板】后缀排序
[洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...
- UOJ #35. 后缀排序[后缀数组详细整理]
#35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...
- Uoj #35. 后缀排序(后缀数组)
35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在 ...
- Codevs 1500 后缀排序(后缀数组)
1500 后缀排序 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个 ...
- [洛谷P2127] 序列排序
洛谷题目链接:序列排序 题目描述 小C有一个N个数的整数序列,这个序列的中的数两两不同.小C每次可以交换序列中的任意两个数,代价为这两个数之和.小C希望将整个序列升序排序,问小C需要的最小代价是多少? ...
- 洛谷P3809 后缀排序【后缀数组】【模板】
题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编 ...
- 【后缀数组】洛谷P3809模板题
题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...
- 洛谷P3809 后缀数组模板
题目:https://www.luogu.org/problemnew/show/P3809 刚学了后缀数组,看人家手写演示了半天,大概明白了过程,但完全写不出来代码: 于是借鉴了许多,不过都差不多, ...
- 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记
题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...
随机推荐
- 吴裕雄--天生自然TensorFlow2教程:numpy [ ] 索引
import tensorflow as tf a = tf.ones([1, 5, 5, 3]) a.shape a[0][0] numpy : 索引 a = tf.random.normal([4 ...
- python os.path.dirname() abspath()
测试文件的名称 path_test.py 先确定文件目录 (my_flask3) python@ubuntu:~/Desktop/flask_news_pro$ python path_test.py ...
- tensorflow C++接口调用目标检测pb模型代码
#include <iostream> #include "tensorflow/cc/ops/const_op.h" #include "tensorflo ...
- CountDownLatch 我的应用场景
记得我是做一个第三方接口,当时需要拿公司的五万辆车通过每周四的夜间去获取违章数据: 三方当时只提供一个只能一辆车去获取未处理的违章数据: 接口是http的方式获取: 当时我是用CountDownLat ...
- maven打包springboot项目的插件配置概览
jar包的术语背景: normal jar: 普通的jar,用于项目依赖引入,不能通过java -jar xx.jar执行,一般不包含其它依赖的jar包. fat jar: 也叫做uber jar,是 ...
- 蓝桥杯 K好数(dp)
Description 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.1 ...
- Entity Framework实现属性映射约定
Entity Framework Code First属性映射约定中“约定”一词,在原文版中为“Convention”,翻译成约定或许有些不好理解,这也是网上比较大多数的翻译,我们就当这是Entity ...
- 新年在家学java之基础篇--类&方法
面向对象 面向对象OOP,面向过程POP 面向对象三大特征 封装 继承 多态 类 类由属性(对应类中的成员变量)和行为(成员方法)来构成 类的成员变量可以先声明,不用初始化,有默认值 方法名称如果多个 ...
- mediawiki问题
部分内容参考 http://blog.csdn.net/gaogao0603/article/details/7689670 1.启用文件上传:在LocalSettings.php修改或者增加如下:$ ...
- 109)PHP与oracle网址
https://pecl.php.net/package/oci8/2.1.8/windowshttps://www.toadworld.com/platforms/oracle/w/wiki/116 ...