题目链接

  今天终于学会了后缀数组模板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后缀排序(后缀数组模板)的更多相关文章

  1. UOJ #35. 后缀排序[后缀数组详细整理]

    #35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...

  2. Uoj #35. 后缀排序(后缀数组)

    35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在 ...

  3. Codevs 1500 后缀排序(后缀数组)

    1500 后缀排序 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个 ...

  4. Luogu P3809 【模板】后缀排序(后缀数组板题)

    忘完了- emmm-

  5. UOJ #35. 后缀排序 后缀数组 模板

    http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. #include<ios ...

  6. 【UOJ #35】后缀排序 后缀数组模板

    http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...

  7. UOJ.35.[模板]后缀排序(后缀数组 倍增)

    题目链接 论找到一个好的教程的正确性.. 后缀数组 下标从1编号: //299ms 2560kb #include <cstdio> #include <cstring> #i ...

  8. 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记

    题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...

  9. [UOJ#35] [UOJ后缀数组模板题] 后缀排序 [后缀数组模板]

    后缀数组,解决字符串问题的有利工具,本题代码为倍增SA算法 具体解释详见2009年国家集训队论文 #include <iostream> #include <algorithm> ...

  10. luogu3809 后缀排序 后缀数组

    ref and 挑战程序设计竞赛. 主要是发现自己以前写得代码太难看而且忘光了,而且我字符串死活学不会啊,kmp这种东西我都觉得是省选+难度啊QAQ #include <iostream> ...

随机推荐

  1. wall命令

    wall——发送广播信息 write all /usr/bin/wall 示例1: # wall 输入命令之后回车便可以广播消息,如输入Hello everybody online后Ctrl+D结束并 ...

  2. Nuget~管理自己的包包

    很久很久以前,自己就想有个包包,最近又从网上淘了一个,价格不便宜呢,99块,还是个小腰包,不过作工还算精良,我喜欢的类型,帆布休闲包,可以将我的手机,耳机,水,小烟,小酒,小伞都放里,方便至极,哈哈!

  3. VB SMTP用户验证发送mail

    转自 http://www.jishuzh.com/program/vb-smtp%E7%94%A8%E6%88%B7%E9%AA%8C%E8%AF%81%E5%8F%91%E9%80%81mail. ...

  4. [opencv] applyColorMap

    applyColorMap 功能 转化为热力图,因为热力图我们看的变化更加细微,在很多地方都用到了热力图. 最近在看CAM,所以记一记这个函数. 感觉还是很有用的. 代码 >>> i ...

  5. Noip 训练指南

    目录 Noip 训练指南 图论 数据结构 位运算 期望 题解 Noip 训练指南 目前完成 \(4 / 72\) 图论 [ ] 跳楼机 [ ] 墨墨的等式 [ ] 最优贸易 [ ] 泥泞的道路 [ ] ...

  6. input类型

    由于我们学习一个新的知识,而以前的都差不多忘完了,下面来复习我们以前学习的input的类型: button     点击的按钮                date    年/月/日 CheckBo ...

  7. leetcode-13-basic-binaryTree

    101. Symmetric Tree 解题思路: 递归的方法如下.分几种情况考虑,如果左子树和右子树都是空,那么返回true:如果不同时为空,返回false:如果都不为空,则 判断其值是否相等,不相 ...

  8. TypeError: cannot use a string pattern on a bytes-like object

    一劳永逸解决:TypeError: cannot use a string pattern on a bytes-like object TypeError: cannot use a string ...

  9. 利用virt-manager,xmanager, xshell启动界面来管理虚拟机

    有时候我们需要搭建一套自己的简单环境来启动一个虚拟机,验证一些问题. 1.首先我利用vmware workstation来创建centos7虚拟机,然后开启虚拟化,如下图所示. 2.其次,启动虚拟机, ...

  10. 2019 study list

    分析工具: (1)SQL   select from   where   group by having   order by   limit   运算符(算数运算符+-*/.比较运算符>< ...