LG P3809 【模板】后缀排序
时间:2021-08-13
本文章向大家介绍LG P3809 【模板】后缀排序,主要包括LG P3809 【模板】后缀排序使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
贴模板
注意:\(\text{id}\) 表示第二关键字排序后(其实无需排序,利用上轮的 \(\text{sa}\) 值即可)相应的第一关键字的位置
计数排序为了稳定性最后确定位置时要倒着开始
复制的 \(\text{ork}\) 要开两倍
\(\text{Code}\)
#include <cstdio>
#include <cstring>
#define re register
using namespace std;
const int N = 1e6 + 5;
int n, sa[N], rk[N], cnt[N], id[N], ork[N << 1];
char s[N];
inline int comp(int x, int y, int w){return (ork[x] == ork[y]) && (ork[x + w] == ork[y + w]);}
inline void build_SA()
{
int m = 300, p;
for(re int i = 1; i <= n; i++) ++cnt[rk[i] = s[i]];
for(re int i = 1; i <= m; i++) cnt[i] += cnt[i - 1];
for(re int i = n; i; i--) sa[cnt[rk[i]]--] = i;
for(re int w = 1; w < n; w <<= 1, m = p)
{
p = 0;
for(re int i = n - w + 1; i <= n; i++) id[++p] = i;
for(re int i = 1; i <= n; i++)
if (sa[i] > w) id[++p] = sa[i] - w;
for(re int i = 0; i <= m; i++) cnt[i] = 0;
for(re int i = 1; i <= n; i++) ++cnt[rk[id[i]]];
for(re int i = 1; i <= m; i++) cnt[i] += cnt[i - 1];
for(re int i = n; i; i--) sa[cnt[rk[id[i]]]--] = id[i];
for(re int i = 1; i <= n; i++) ork[i] = rk[i];
p = 0;
for(re int i = 1; i <= n; i++)
rk[sa[i]] = comp(sa[i], sa[i - 1], w) ? p : ++p;
if (p >= n) break;
}
}
int main()
{
scanf("%s", s + 1), n = strlen(s + 1), build_SA();
for(re int i = 1; i <= n; i++) printf("%d ", sa[i]);
}
原文地址:https://www.cnblogs.com/leiyuanze/p/15138906.html
- apache开启openssl支持
- 微信小程序开发常见问题(二)
- PHP数据结构(二十一) ——希尔排序
- PHP数据结构(二十二) ——快速排序
- PHP数据结构(二十三) ——快速排序
- PHP数据结构(二十四) ——堆排序
- PHP数据结构(二十五) ——并归排序
- PHP数据结构(二十六) ——基数排序实现36进制数排序
- Apache配置
- jquery事件
- 设计模式专题(二)——策略模式
- ASP.NET AJAX(10)__Authentication ServiceAuthentication ServiceAuthentication Service属性Authentication
- 高效开发 MVVM 和 databinding 你需要使用的工具
- ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 有了MinIO,你还会用FastDFS么?
- STP 实验
- 算法集锦(6) |基于GPU框架的tensorflow数据增强算法
- 交换机端口安全实验
- 算法集锦(7)| 实用代码 | Google Colab使用及配置技巧
- 浏览器标签页分屏_不同浏览器同一个tab里面怎么实现分屏?#技能get#
- 微信小程序开发实战(16):交互组件
- Linux常用命令
- 一日一技:使用异或寻找两个孤独的数
- Chrome 85的Referrer-Policy调整对网站分析工具的影响
- 同时搞定Android和iOS的Dart语言(1):Dart初探
- Linux进程控制
- Java自动化测试(HttpClient 13)
- Linux命名管道及函数
- Linux消息队列及函数