P3809 【模板】后缀排序
后缀数组sa[i]就表示排名为i的后缀的起始位置
x[i]是第i个元素的第一关键字
y[i]表示第二关键字排名为i的数,在第一关键字中的位置
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 1000005
#define rint register int
int n,m,c[N],sa[N],x[N],y[N]; char s[N];
void get_sa(){
for(rint i=;i<=n;++i) ++c[x[i]=s[i]];
for(rint i=;i<=m;++i) c[i]+=c[i-];
for(rint i=n;i>=;--i) sa[c[x[i]]--]=i;
for(rint k=;k<=n;k<<=){
rint u=;
for(rint i=n-k+;i<=n;++i) y[++u]=i;//逆序也没关系,因为都是没有
for(rint i=;i<=n;++i) if(sa[i]>k) y[++u]=sa[i]-k;
for(rint i=;i<=m;++i) c[i]=;
for(rint i=;i<=n;++i) ++c[x[i]];
for(rint i=;i<=m;++i) c[i]+=c[i-];
for(rint i=n;i>=;--i) sa[c[x[y[i]]]--]=y[i],y[i]=;//按第二关键字排序
swap(x,y); x[sa[]]=; u=;
for(rint i=;i<=n;++i)
x[sa[i]]=(y[sa[i]]==y[sa[i-]]&&y[sa[i]+k]==y[sa[i-]+k])?u:++u;
if(u==n){break;} m=u;
}
}
int main(){
scanf("%s",s+); n=strlen(s+),m=;
get_sa();
for(rint i=;i<=n;++i) printf("%d ",sa[i]);
return ;
}
sa求最长公共前缀
void get_height() //求最长公共前缀
{
for(rint i=;i<=n;i++) rk[sa[i]]=i;
rint k=;
for(rint i=;i<=n;i++)
{
if(rk[i]==) continue;
if(k) --k;
rint j=sa[rk[i]-];
while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k]) ++k;
height[rk[i]]=k;
}
}
P3809 【模板】后缀排序的更多相关文章
- 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记
题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...
- UOJ.35.[模板]后缀排序(后缀数组 倍增)
题目链接 论找到一个好的教程的正确性.. 后缀数组 下标从1编号: //299ms 2560kb #include <cstdio> #include <cstring> #i ...
- 洛谷:P3809 【模板】后缀排序(后缀数组模板)
P3809 [模板]后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英 ...
- [洛谷P3809]【模板】后缀排序
[洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...
- 【模板】后缀排序(SA数组)
[模板]后缀排序 题目背景 这是一道模板题. 题目描述 读入一个长度为 \(n\) 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字 ...
- LG3809 【模板】后缀排序
题意 题目背景 这是一道模板题. 题目描述 读入一个长度为 $ n $ 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的 ...
- codevs1500 后缀排序
题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设 ...
- UOJ#35 后缀排序
这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为 ...
- 2018.11.24 loj#111. 后缀排序(后缀数组)
传送门 后缀排序模板题. 终于会后缀数组了(然而只会倍增并不会DC3DC3DC3). 在这里列举几个数组的意思: sai:sa_i:sai:当前排名第iii的后缀的起始下标. rkirk_irki ...
随机推荐
- jenkins 的一个BUG
最近更新了一批jenkin插件,更新完问题来了全局设置无法保存了... 报错如下 Stack trace net.sf.json.JSONException: null object at net.s ...
- linux 下查看c 函数帮助
帮助文档 man man MANUAL SECTIONS The standard sections of the manual include: User Commands System Calls ...
- 从零开始一起学习SLAM | SLAM有什么用?
SLAM是 Simultaneous Localization And Mapping的 英文首字母组合,一般翻译为:同时定位与建图.同时定位与地图构建. 「同时定位与地图构建」这几个词,乍一听起来非 ...
- Navicat Premium 安装与激活破解版简单操作 (原)
首先下载navicate程序以及破解文件,这里一并存到了百度网盘直接下载即可 链接:https://pan.baidu.com/s/11ptFmsV1o3B5oB00zm2NdQ 密码:yw82 解压 ...
- HTML+css+html5基础+css3须知
1.定位四种 静态定位(static):文档流默认的定位方式:一般不用写. 如果没有指定元素的position属性值,元素也就是静态定位.static是position属性的默认值,它表示块 ...
- JavaScript-isFinite()判断是否数字有效
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- laravel中使用event
https://www.cnblogs.com/ziyouchutuwenwu/p/4274539.html
- python -- 判断给定的参数是否是地理位置的经度和纬度
例子: coordinates = "2.3,-8ui" 无效地理位置 coordinates = "2.3,-8i" 有效地理位置 方法一:使用try...e ...
- Redis Cluster(集群)的搭建
一.Redis的下载.安装.启动(单实例) 我们统一将Redis安装在/opt目录下,执行命令如下: $ cd /opt $ wget http://download.redis.io/release ...
- html5-移动端布局模板
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...