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 ...
随机推荐
- 【Java】-NO.16.EBook.4.Java.1.005-【疯狂Java讲义第3版 李刚】- 枚举
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.005-[疯狂Java讲义第3版 李刚]- 枚举 Style:EBook Series:Java Si ...
- ES代替DB建模后的维护流程架构
- [LeetCode] 339. Nested List Weight Sum_Easy tag:DFS
Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...
- jmeter二次开发----Loadrunner或Jmeter发送邮件报告
Loadrunner支持Java Vuser,而Jmeter本身就是基于Java开发的,所以两者都可以通过JMail组件实现邮件发送.本人使用的是mail-1.4.7.jar,可以通过下载获得:htt ...
- C++ 执行 cmd 命令 删除文件 删除注册表项
#include <Windows.h> WinExec("cmd /C \"del C:\\Windows\\secretWin.ini\"",S ...
- JavaScript学习笔记之call和apply
前端的知识面太广了,想要记住所有知识点是不可能的,所以将这些学过的记录下来,随时都可以翻开来参考 1.call方法 调用一个对象的一个方法,call(this, arg1, arg2,argN);用来 ...
- Rpgmakermv(16) YEP MainmenuManager
---------------------------------------------------------------------------------------------------- ...
- 【Hadoop学习之十一】MapReduce案例分析三-PageRank
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 什么是pagerank?算法原理- ...
- MySql 查询表中字段的数据类型
[1]MySQL中查询某表中字段的数据类型 (1)DESC 表名: (2)DESCRIBE 表名: (3)SHOW COLUMNS FROM 表名: 应用示例: DESC cfg_acct_free_ ...
- gitlab提交内容关联到slack通知
gitlab提交内容关联到slack通知 https://docs.gitlab.com/ee/user/project/integrations/slack.html 首先去slack做相关的设置 ...