题目链接

  今天终于学会了后缀数组模板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. 使用Java connector消费ABAP系统的函数

    Java Connector(JCO)环境的搭建:Step by step to download and configure JCO in your laptop 我的ABAP系统有个函数名叫ZDI ...

  2. HDU 5094 Maze (状压)

    加一个维度,钥匙的状态,状压一下.n很小,钥匙也只有10个,bfs就好了. 忘了数组初始化.以后坚决不犯这种低级错误. #include<cstdio> #include<queue ...

  3. 监控服务端口状态python脚本

    #!/usr/bin/python import socket,os,time data={ 8080:"tomcat9", 18080:"tomcat_hjgdmj&q ...

  4. unbuntu&vim&Kali的各种小知识

    1. vmware workstation 15.0.0 2.ubuntu-18.10-desktop  使用网络地址转换 VMware workstation 1.ctrl+alt 返回  unbu ...

  5. 用fmt标签对EL表达式取整

    本篇文章转载自:https://blog.csdn.net/u013400939/article/details/47948541 一般来说我们是无法实现EL表达式取整的.对于EL表达式的除法而言,他 ...

  6. java基础—java读取properties文件

    一.java读取properties文件总结 在java项目中,操作properties文件是经常要做的,因为很多的配置信息都会写在properties文件中,这里主要是总结使用getResource ...

  7. 洛谷 P1147 连续自然数和

    洛谷 P1147 连续自然数和 看到dalao们的各种高深方法,本蒟蒻一个都没看懂... 于是,我来发一篇蒟蒻友好型的简单题解 #include<bits/stdc++.h> using ...

  8. 一个4年工作经验的java程序员的困惑,怎样才能能为一个架构师,请教大神

    一个4年工作经验的java程序员的困惑,怎样才能能为一个架构师 LZ本人想往架构师发展, 业余时间也会看一些书籍, 但是感觉没有头绪, 有些书看了,也没有地方实践 我做了4年的java开发, 在一个公 ...

  9. spring boot yaml 自定义配置 映射到 java POJO

    只需要一个注解就ok: @ConfigurationProperties("user.other") “user.other” 这个值匹配的是user下的other对象 yaml ...

  10. Buffered Channels and Worker Pools

    原文链接:https://golangbot.com/buffered-channels-worker-pools/ buffered channels 带有缓冲区的channel 只有在缓冲区满之后 ...