题目链接

  今天终于学会了后缀数组模板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. 删除表中一个字段的SQL语句

    1.删除没有默认值的列:alter table Test drop COLUMN BazaarType 2.删除有默认值的列:先删除约束(默认值)alter table Test DROP CONST ...

  2. 2018.5.14 PHP基础学习

    1.使用PHP输出HTML 使用PHP输出一个表格,并且通过style标签改变字体 <!--思考与练习--> <style type="text/css"> ...

  3. 队列的add与offer的区别

    两个方法都表示往队列里添加元素 但是当出现异常时,add方法抛出异常 而offer则返回的是false,就是啥事也没有,也不抛异常,也没有添加成功!

  4. php的字符转换 & php登入注册界面设计以及源码 & 分离公共部分

    我们在编写的时候总是会出现乱码 https://www.cnblogs.com/mafeng/p/5827215.html php登入注册界面设计以及源码 https://blog.csdn.net/ ...

  5. java基础—接口概念

    一.接口的概念 JAVA是只支持单继承的,但现实之中存在多重继承这种现象,如“金丝猴是一种动物”,金丝猴从动物这个类继承,同时“金丝猴是一种值钱的东西”,金丝猴从“值钱的东西”这个类继承,同时“金丝猴 ...

  6. java基础—基础语法2

    一.语句

  7. 中英文字符串截取函数msubstr

    Thinkphp内置了一个可以媲美smarty的模板引擎,给我们带来了很大的方便.调用函数也一样,可以和smarty一样调用自己需要的函数,而官方也内置了一些常用的函数供大家调用. 比如今天我们说的截 ...

  8. C#与SQLServer数据库连接

    第一种连接数据库方法:直接通过数据库的用户名.密码等连接 步骤: (1)建立SqlConnection对象,指定SqlConnection对象的ConnectionString属性: (2)打开数据库 ...

  9. redis学习笔记(2)

    redis学习笔记第二部分 --配置文件介绍 二,解析redis的配置文件redis.conf常见配置参数说明redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通 ...

  10. MySQL数据库主从切换脚本自动化

    MySQL数据库主从切换脚本自动化 本文转载自:https://blog.csdn.net/weixin_36135773/article/details/79514507 在一些实际环境中,如何实现 ...