传送门

解题思路

这是一个神奇的算法,sa[i]表示排名第i为的元素是啥,rk[i]表示第i个元素排名是啥。然后使用基数排序+倍增的思想去处理。主要是参考的这位大佬的博客(https://www.cnblogs.com/victorique/p/8480093.html#autoid-1-3-4)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std;
const int MAXN = 1e6+5; int sa[MAXN],x[MAXN],y[MAXN];
int num,c[MAXN],n,m;
int rk[MAXN],height[MAXN];
char s[MAXN]; inline void Get_SA(){
for(register int i=2;i<=m;i++) c[i]+=c[i-1];
for(register int i=n;i;i--) sa[c[x[i]]--]=i;
for(register int k=1;k<=n;k<<=1){
num=0;
for(register int i=n-k+1;i<=n;i++) y[++num]=i;
for(register int i=1;i<=n;i++)
if(sa[i]>k) y[++num]=sa[i]-k;
for(register int i=2;i<=m;i++) c[i]=0;
for(register int i=1;i<=n;i++) c[x[i]]++;
for(register int i=2;i<=m;i++) c[i]+=c[i-1];
for(register int i=n;i;i--)
sa[c[x[y[i]]]--]=y[i],y[i]=0;
// for(register int i=1;i<=n;i++)
// cout<<sa[i]<<" ";
// cout<<endl;
swap(x,y);num=1;x[sa[1]]=1;
for(register int i=2;i<=n;i++){
if(y[sa[i]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k])
x[sa[i]]=num;
else x[sa[i]]=++num;
}
if(num==n) return;
m=num;
}
} inline void Get_height(){
for(register int i=1;i<=n;i++) rk[sa[i]]=i;
// for(register int i=1;i<=n;i++) cout<<rk[i]<<" ";
int k=0,j=0;
for(register int i=1;i<=n;i++){
if(rk[i]==1) continue;
if(k) k--;
j=sa[rk[i]-1];
while(j+k<=n && i+k<=n && s[i+k]==s[j+k]) k++;
height[rk[i]]=k;
}
for(register int i=1;i<=n;i++)
cout<<height[i]<<" ";
} int main(){
scanf("%s",s+1);
n=strlen(s+1);
m=(int)'z';
for(register int i=1;i<=n;i++){
x[i]=s[i];
c[x[i]]++;
}
Get_SA();
for(register int i=1;i<=n;i++)
printf("%d ",sa[i]);
// Get_height();
return 0;
}

LUOGU 3089 后缀排序(模板)的更多相关文章

  1. 2018.11.24 loj#111. 后缀排序(后缀数组)

    传送门 后缀排序模板题. 终于会后缀数组了(然而只会倍增并不会DC3DC3DC3). 在这里列举几个数组的意思: sai:sa_i:sai​:当前排名第iii的后缀的起始下标. rkirk_irki​ ...

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

    题目链接 今天终于学会了后缀数组模板qwq 不过只会模板emmmm 首先我们有一本蓝书emmmmmm 然后看到蓝书221页代码之后我就看不懂了 于是请出rqy rqy: 一开始那是个对单个字符排序的操 ...

  3. 洛谷:P3809 【模板】后缀排序(后缀数组模板)

    P3809 [模板]后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英 ...

  4. P3809 【模板】后缀排序

    P3809 [模板]后缀排序 从这学的 后缀数组sa[i]就表示排名为i的后缀的起始位置 x[i]是第i个元素的第一关键字 y[i]表示第二关键字排名为i的数,在第一关键字中的位置 #include& ...

  5. [洛谷P3809]【模板】后缀排序

    [洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...

  6. 【模板】后缀排序(SA数组)

    [模板]后缀排序 题目背景 这是一道模板题. 题目描述 读入一个长度为 \(n\) 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字 ...

  7. LG3809 【模板】后缀排序

    题意 题目背景 这是一道模板题. 题目描述 读入一个长度为 $ n $ 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的 ...

  8. UOJ#35 —— 后缀排序

    1.题目大意:后缀数组模板题 2.分析:汝佳的书上的代码的有bug,还有那个n是字符串长度+1,''也要加入排序的 存个模板QAQ #include <cstdio> #include & ...

  9. codevs1500 后缀排序

    题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设 ...

随机推荐

  1. Mac OS X 下有关adb相关问题

    一.什么是adb? ADB的全称是Android Debug Bridge,用来调试Android程序的,白话点就是debug工具! 位置:一般下载Android的SDK时候在platform-too ...

  2. 简单的JMS实例

    1.首先需要一台JMS的提供者,在这里我选择使用的是apache-activemq-5.3.2这个服务器,首先下载服务器并通过bin目录下的activemq.bat启动服务器,此时可通过http:// ...

  3. springboot自己实现mysql主从数据切换机制

    在很多公司都是实现了数据的读写分离,所谓的读写分离,就是写的时候从主库 ,然后从库就会从主库中复制过去,这样就会形成了数据的读写分离,然而在很多场景是适用的,那么我们怎么做呢,可以利用aop 加注解的 ...

  4. Quota- Linux必学的60个命令

    1.作用 quota命令用来显示磁盘使用情况和限制情况,使用权限超级用户. 2.格式 quota [-g][-u][-v][-p] 用户名 组名 3.参数 -g:显示用户所在组的磁盘使用限制. -u: ...

  5. JavaScript数据可视化编程书籍上面的例子(flotr2)

    先看demo再看例子 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  6. jiba中文分词原理

    中文分词就是将一个汉字序列分成一个一个单独的词. 现有的分词算法有三大类: 基于字符串匹配的分词:机械分词方法,它是按照一定的策略将待分析的字符串与一个充分大的机器词典中的词条进行匹配,若在词典中找到 ...

  7. java虚拟机(十)--性能监控工具测试内存溢出和死锁基本思路

    在之前就曾经简单介绍过jdk自带的性能检测工具,但是只是很入门的内容.没有真正的用过都是白扯了,面试的时候也说不过去,更别提真正 在生产环境去解决问题,所以这里我们学习一下真正解决问题的过程,最起码面 ...

  8. 2019牛客暑期多校赛(第一场) A Equivalent Prefixes(单调栈)

    传送门:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个数组a和b,求最大的p,满足在区间 [1,p] 中任何区间的两个数组的最小值的下标都相等. 思 ...

  9. IO流12 --- 转换流InputStreamReader --- 技术搬运工(尚硅谷)

    InputStreamReader 将字节输入流转换为字符输入流 @Test public void test1(){ InputStreamReader isr = null; try { //字节 ...

  10. [Day3] Nginx配置Https

    一. 网络安全之Http与Https Http协议是互联网行业中设计的最好架构之一.20多年间,应用Http协议传输数据的软件越来越多,企图从http协议传输中非法获取.篡改用户重要数据的非法行为也越 ...