【Luogu】P3809后缀排序(后缀数组模板)
今天终于学会了后缀数组模板qwq
不过只会模板emmmm
首先我们有一本蓝书emmmmmm
然后看到蓝书221页代码之后我就看不懂了
于是请出rqy
rqy:
一开始那是个对单个字符排序的操作啊
c[i]表示值为i的字符有多少个
x[i]表示第i个位置的优先级是多少
sa[i]表示优先级是i的字符位置
然后第一行明显是初始化,第二行明显就是统计字符个数
至于第三行为什么要求前缀和呢
我们思考优先级越小的排的越靠前
所以说,设优先级是0的有c[0]个,优先级是1的有c[1]个,以此类推
所以说我们有c[0]个字符假设是'0',应该排到[ 0,c[0] )区间左闭右开
然后截下来有c[1]个字符假设是'1',应该排到[ c[0],c[0]+c[1] )区间左闭右开
然后以此类推
所以我们简记一下c的前缀和,记为S
于是我们排序的区间就变成了[0,S[0]) [S[0],S[1]) [S[1],S[2])
等等等等。
然后就可以愉快的基数排序啦
然后考虑我们怎么搞两个关键字的排序
就是我先把第二关键字排上,然后保证排序算法稳定的情况下排第一关键字
第二关键字我可以直接枚举排。第一关键字……基数排序可以搞定qwq。
然后看相邻的两个后缀编号是否相等,如果相等说明没能把它们区分开,接着排,如果不相等就可以退出了。
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<cstdlib>
#define maxn 2000100
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} char s[maxn];
int sa[maxn];
int x[maxn];
int y[maxn];
int c[maxn];
int len; void build(int m){
for(int i=;i<=m;++i) c[i]=;
for(int i=;i<=len;++i) c[x[i]=s[i]]++;
for(int i=;i<=m;++i) c[i]+=c[i-];
for(int i=len;i>=;--i) sa[c[x[i]]--]=i;
for(int k=;k<=len;k<<=){
int p=;
for(int i=len-k+;i<=len;++i) y[++p]=i;
for(int i=;i<=len;++i)
if(sa[i]>k) y[++p]=sa[i]-k;
for(int i=;i<=m;++i) c[i]=;
for(int i=;i<=len;++i) c[x[y[i]]]++;
for(int i=;i<=m;++i) c[i]+=c[i-];
for(int i=len;i>=;--i) sa[c[x[y[i]]]--]=y[i];
std::swap(x,y);
p=; x[sa[]]=;
for(int i=;i<=len;++i)
x[sa[i]]=y[sa[i-]]==y[sa[i]]&&y[sa[i-]+k]==y[sa[i]+k]?p:++p;
if(p>=len) break;
m=p;
}
} int main(){
scanf("%s",s+);
len=strlen(s+);
build();
for(int i=;i<=len;++i) printf("%d ",sa[i]);
return ;
}
【Luogu】P3809后缀排序(后缀数组模板)的更多相关文章
- UOJ #35. 后缀排序[后缀数组详细整理]
#35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...
- Uoj #35. 后缀排序(后缀数组)
35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在 ...
- Codevs 1500 后缀排序(后缀数组)
1500 后缀排序 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个 ...
- Luogu P3809 【模板】后缀排序(后缀数组板题)
忘完了- emmm-
- UOJ #35. 后缀排序 后缀数组 模板
http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. #include<ios ...
- 【UOJ #35】后缀排序 后缀数组模板
http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...
- UOJ.35.[模板]后缀排序(后缀数组 倍增)
题目链接 论找到一个好的教程的正确性.. 后缀数组 下标从1编号: //299ms 2560kb #include <cstdio> #include <cstring> #i ...
- 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记
题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...
- [UOJ#35] [UOJ后缀数组模板题] 后缀排序 [后缀数组模板]
后缀数组,解决字符串问题的有利工具,本题代码为倍增SA算法 具体解释详见2009年国家集训队论文 #include <iostream> #include <algorithm> ...
- luogu3809 后缀排序 后缀数组
ref and 挑战程序设计竞赛. 主要是发现自己以前写得代码太难看而且忘光了,而且我字符串死活学不会啊,kmp这种东西我都觉得是省选+难度啊QAQ #include <iostream> ...
随机推荐
- [论文理解] Rapid-Object-Detection-using-a-Boosted-cascade-of-simple-features
Rapid-Object-Detection-using-a-Boosted-cascade-of-simple-features 简介 文章是2001年发表的,是一篇很经典的Object Detec ...
- 多线程程序设计-Thread的一些方法
run():是程序中会和会和其他线程“同时”执行的部分. wait():使得当前线程进入等待状态,等待的线程不会主动进入到线程队列中排队等待cpu资源,必须由其他线程调用notify()方法通知它 ...
- java中求几个字符串的最大公共子串 使用了比较器Comparator
package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.Compar ...
- JavaScript递归实现对象深拷贝
let personOne = { name:"张三", age:18, sex:"male", children:{ first:{ name:"z ...
- c内置数据类型
参考 C与指针 第三章 类型 类型标识符 字节 表示数值范围 备注 整型 [signed] int 2* -32768~32767 -2^15 ~ (2^15 -1) 无符号整型 unsigned [ ...
- NOIP复习之1 数学数论
noip一轮复习真的要开始啦!!! 大概顺序是这样的 1.数学 2.搜索贪心 3.数据结构 4.图论 5.dp 6.其他 数学 1.数论 数论被称为数学皇冠上的明珠,他的重要性主要在于它是其他学习的祖 ...
- H5(一)H5与HTML、XHTML的不同
一.基本概念 html:超文本标记语言 (Hyper Text Markup Language) xhtml:可扩展超文本标记语言,是一种置标语言,表现方式与超文本标记语言(HTML)类似,不过语法上 ...
- 08/07/2017 R
from today,i will learn something about the R. install R studio code: 1.>install.packages("s ...
- leetcode-18-remove
283. Move Zeroes 解题思路: 从nums[0]开始,如果是零就和它后面的第一个非零数交换,不是零就下一位.不贴代码了,比较简单. 27. Remove Element 解题思路: 这道 ...
- LeetCode(203) Remove LinkedList Elements
题目 Remove all elements from a linked list of integers that have value val. Example Given: 1 –> 2 ...