题目背景

这是一道模板题。

题目描述

读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置。位置编号为 1 1 1 到 n n n。

输入输出格式

输入格式:

一行一个长度为 n n n 的仅包含大小写英文字母或数字的字符串。

输出格式:

一行,共n个整数,表示答案。

输入输出样例

输入样例#1:
复制

ababa
输出样例#1: 复制

5 3 1 4 2

说明

n<=106n <= 10^6n<=106

题解

倍增算法的后缀数组

表示并不会DC3

代码

//by 减维
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<bitset>
#include<set>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<ctime>
#include<algorithm>
#define ll long long
#define db double
#define inf 1<<30
#define maxn 1000005
#define eps 1e-8
using namespace std; int n,m,a[maxn],c[maxn],sa[maxn],tp[maxn],rnk[maxn],hei[maxn];
char s[maxn]; void srt()
{
for(int i=;i<=m;++i)c[i]=;
for(int i=;i<=n;++i)c[rnk[tp[i]]]++;
for(int i=;i<=m;++i)c[i]+=c[i-];
for(int i=n;i;i--)sa[c[rnk[tp[i]]]--]=tp[i];
} bool cmp(int *f,int x,int y,int w){return f[x]==f[y]&&f[x+w]==f[y+w];} void getsa()
{
for(int i=;i<=n;++i)rnk[i]=a[i],tp[i]=i;
m=;srt();
for(int p=,ln=;p<n;ln+=ln,m=p)
{
p=;
for(int i=n-ln+;i<=n;++i)tp[++p]=i;
for(int i=;i<=n;++i)if(sa[i]>ln)tp[++p]=sa[i]-ln;
srt();swap(tp,rnk);rnk[sa[]]=p=;
for(int i=;i<=n;++i)rnk[sa[i]]=cmp(tp,sa[i],sa[i-],ln)?p:++p;
}
int k=,j;
for(int i=;i<=n;hei[rnk[i++]]=k)
for(k=k?k-:k,j=sa[rnk[i]-];a[j+k]==a[i+k];k++);
} int main()
{
scanf("%s",s+);
n=strlen(s+);
for(int i=;i<=n;++i)a[i]=s[i];
getsa();
for(int i=;i<=n;++i)printf("%d ",sa[i]);
return ;
}

【后缀数组】洛谷P3809模板题的更多相关文章

  1. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

  2. 【最大流ISAP】洛谷P3376模板题

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  3. 【后缀自动机】洛谷P3804模板题

    题目描述 给定一个只包含小写字母的字符串SSS, 请你求出 SSS 的所有出现次数不为 111 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SSS ...

  4. LCA算法倍增算法(洛谷3379模板题)

    倍增(爬树)算法,刚刚学习的算法.对每一个点的父节点,就记录他的2k的父亲. 题目为http://www.luogu.org/problem/show?pid=3379 第一步先记录每一个节点的深度用 ...

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

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

  6. 洛谷 P4148 简单题 KD-Tree 模板题

    Code: //洛谷 P4148 简单题 KD-Tree 模板题 #include <cstdio> #include <algorithm> #include <cst ...

  7. 【noip】跟着洛谷刷noip题2

    noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...

  8. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  9. 洛谷 P1167 刷题

    洛谷 P1167 刷题 洛谷传送门 题目描述 noip临近了,小A却发现他已经不会写题了.好在现在离竞赛还有一段时间,小A决定从现在开始夜以继日地刷题.也就是说小A废寝忘食,一天二十四小时地刷题. 今 ...

随机推荐

  1. Cairo-Dock 系统关机无效

    正文 背景 Cairo-Dock 设置为开机自己主动启动后.系统菜单条里的关机选项就无效了,命令行里能够使用命令关机. 搜索过程 这次google找到的结果让我非常失望,于是仅仅好百度了. 在百度贴吧 ...

  2. EGOCache缓存框架具体解说

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  3. 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(一)

    CCOA是驰骋又一款对外开源的软件.集成了CCFlow(流程设计器.表单设计器)CCIM与GPM(权限系统管理),能够说,CCOA集中了驰骋开源的全部产品.同一时候,CCOA本身也具有一些功能.能够帮 ...

  4. 五:Java之Vector类专题

    据说期末考试要考到Vector 这个类,出于复习须要在这里就要好好整理下这个类了. 一.基本概念 Vector 是可实现自己主动增长的对象数组. java.util.vector提供了向量类(vect ...

  5. as 与 is

    在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别:在视图(VIEW)中只能用AS:在游标(CURSOR)中只能用IS.

  6. 以流方式读写文件:文件菜单打开一个文件,文件内容显示在RichTexBox中,执行复制、剪切、粘贴后,通过文件菜单可以保存修改后的文件。

    MainWindow.xaml文件 <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&q ...

  7. Linux基础:文件查找find

    写在前面 在linux的日常管理中,find的使用频率很高,熟练掌握对提高工作效率很有帮助. find的语法比较简单,常用参数的就那么几个,比如-name.-type.-ctime等.初学的同学直接看 ...

  8. KendoUI 基础:Grid 绑定template展示

    Grid 绑定template展示 <div id="TodayEditorGrid" style="margin:0 10px"></div ...

  9. SQL Server 文章目录

    SQL Server系列: 高可用方案 SQL Server Alwayson概念总结 SQL Server AlwaysOn搭建 SQL Server2016 Alwayson新增功能 SQL Se ...

  10. @Data 注解引出的 lombok 小辣椒

    今天在看代码的时候, 看到了这个注解, 之前都没有见过, 所以就查了下, 发现还是个不错的注解, 可以让代码更加简洁. 这个注解来自于 lombok,lombok 能够减少大量的模板代码,减少了在使用 ...