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 ...
随机推荐
- Py中map与np.rival学习
转自:廖雪峰网站 1.map/reduce map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. 举例说明 ...
- 【LeetCode每天一题】Reverse Linked List(链表反转)
Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL ...
- PowerDesigner安装及破解
1.复制pdflm16.dll文件. 2.. 找到PowerDesigner16.5的安装目录,然后粘贴pdflm16.dll,替换安装目录里面的pdflm16.dll文件: 3.重新启动PowerD ...
- [Java in NetBeans] Lesson 10. For Loops
这个课程的参考视频和图片来自youtube. 主要学到的知识点有:(the same use in C/C++) 1. x++, x += 1; similar x--, x -= 1; x *= 2 ...
- css--clearfix浮动
解读浮动闭合最佳方案:clearfix: http://www.daqianduan.com/3606.html clearfix清除浮动进化史:http://www.admin10000.com/d ...
- Windows搭建react-native开发环境
一.目标平台 windows+android 1. 必须软件 python2+ nodejs npm 2. 安装react-native命令行 $ npm install -g react-nativ ...
- hibernate中configuration和配置文件笔记
hibernate的核心类和接口 Configuration类 作用:(1)读取hibernate.cfg.xml文件 (2)管理对象关系映射文件<mapping resource=" ...
- 基于MySQL提供的Yum repository安装MySQL5.6
基于MySQL提供的Yum repository安装MySQL5.6 1:下载YUM包 1.1切换到root用户: 1)su - root 2)wget http://dev.mysql.com/ge ...
- 在liunx系统里面进行复制文件的时候报错:cp:omitting directiory
在复制的时候执行命令:cp /TEST/test1 /TEST/test2 结果报错:cp:omitting directior 报错原因:test1下面还有文件,不能删除 解决办法:cp -r / ...
- SV通过DPI调用C
Verilog与C之间进行程序交互,PLI(Programming Language Interface)经过了TF,ACC,VPI等模式. 使用PLI可以生成延时计算器,来连接和同步多个仿真器,并可 ...