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 【模板】后缀排序的更多相关文章

  1. 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记

    题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...

  2. UOJ.35.[模板]后缀排序(后缀数组 倍增)

    题目链接 论找到一个好的教程的正确性.. 后缀数组 下标从1编号: //299ms 2560kb #include <cstdio> #include <cstring> #i ...

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

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

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

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

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

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

  6. LG3809 【模板】后缀排序

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

  7. codevs1500 后缀排序

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

  8. UOJ#35 后缀排序

    这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为 ...

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

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

随机推荐

  1. Py中map与np.rival学习

    转自:廖雪峰网站 1.map/reduce map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. 举例说明 ...

  2. 【LeetCode每天一题】Reverse Linked List(链表反转)

    Reverse a singly linked list. Example:           Input: 1->2->3->4->5->NULL          ...

  3. PowerDesigner安装及破解

    1.复制pdflm16.dll文件. 2.. 找到PowerDesigner16.5的安装目录,然后粘贴pdflm16.dll,替换安装目录里面的pdflm16.dll文件: 3.重新启动PowerD ...

  4. [Java in NetBeans] Lesson 10. For Loops

    这个课程的参考视频和图片来自youtube. 主要学到的知识点有:(the same use in C/C++) 1. x++, x += 1; similar x--, x -= 1; x *= 2 ...

  5. css--clearfix浮动

    解读浮动闭合最佳方案:clearfix: http://www.daqianduan.com/3606.html clearfix清除浮动进化史:http://www.admin10000.com/d ...

  6. Windows搭建react-native开发环境

    一.目标平台 windows+android 1. 必须软件 python2+ nodejs npm 2. 安装react-native命令行 $ npm install -g react-nativ ...

  7. hibernate中configuration和配置文件笔记

    hibernate的核心类和接口 Configuration类 作用:(1)读取hibernate.cfg.xml文件 (2)管理对象关系映射文件<mapping resource=" ...

  8. 基于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 ...

  9. 在liunx系统里面进行复制文件的时候报错:cp:omitting directiory

    在复制的时候执行命令:cp /TEST/test1 /TEST/test2 结果报错:cp:omitting directior 报错原因:test1下面还有文件,不能删除 解决办法:cp -r  / ...

  10. SV通过DPI调用C

    Verilog与C之间进行程序交互,PLI(Programming Language Interface)经过了TF,ACC,VPI等模式. 使用PLI可以生成延时计算器,来连接和同步多个仿真器,并可 ...