洛谷P3809 后缀数组模板
题目:https://www.luogu.org/problemnew/show/P3809
刚学了后缀数组,看人家手写演示了半天,大概明白了过程,但完全写不出来代码;
于是借鉴了许多,不过都差不多,总算会写了;
如何把想法实现出来很重要啊...
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int const maxn=1e6+5; int n,m,rk[maxn],tp[maxn],sa[maxn],a[maxn],num,tax[maxn]; char s[maxn]; void Rsort() {for(int i=0;i<=m;i++)tax[i]=0;for(int i=1;i<=n;i++)tax[rk[tp[i]]]++;for(int i=1;i<=m;i++)tax[i]+=tax[i-1];for(int i=n;i;i--)sa[tax[rk[tp[i]]]--]=tp[i];//tp是位置,rk是该位置第一关键字排名,tax存数量 //tp[i]是第二关键字从小到大进入,所以从大到小出来就可以使用前缀 } void work() {for(int i=1;i<=n;i++)rk[i]=a[i],tp[i]=i;Rsort();for(int k=1;k<=n;k<<=1){num=0;for(int i=n-k+1;i<=n;i++)tp[++num]=i;//n-k以后的i后缀第二关键字是0,字典序最小 for(int i=1;i<=n;i++)//枚举排名(上一次的,也就是本次第一关键字) if(sa[i]>k)tp[++num]=sa[i]-k;//排名从小到大,其所在位置如果大于k,则可以作为本次第二关键字//sa[i]-k 是位置,若上一次的第i名作为本次第二关键字,则所得后缀的位置在sa[i]-k Rsort();swap(rk,tp);//tp存下上一次排名,也就是本次第一关键字的排名 rk[sa[1]]=1;num=1;for(int i=2;i<=n;i++)rk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+k]==tp[sa[i-1]+k])?num:++num;//比较前后两半排名是否相同 if(num==n)break;m=num;//m是种类 } } int main() {cin>>s;n=strlen(s); m=122;for(int i=1;i<=n;i++)a[i]=s[i-1]; work();for(int i=1;i<=n;i++)printf("%d ",sa[i]);return 0; }
转载于:https://www.cnblogs.com/Zinn/p/9329820.html
洛谷P3809 后缀数组模板相关推荐
- 洛谷P3809 后缀排序【后缀数组】【模板】
题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编 ...
- 【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1031 [题意] [题解] 后缀数组模板题; 把整个字符串扩大一倍. 即长度乘2 然后搞 ...
- 后缀数组 java实现_后缀数组模板 - java开发指南博客 【转载】 - ITeye博客
//后缀数组模板 int wa[maxn],wb[maxn],wv[maxn],ws[maxn];//这些都是需要用到的中间变量 int cmp(int *r,int a,int b,int l) { ...
- 【后缀数组】洛谷P3809模板题
题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...
- 后缀数组模板 hdu1403
题意:就是让你求两个字符串的最大子串 #include <bits/stdc++.h> const int maxn=200005; using namespace std; int s[ ...
- 刘汝佳蓝书后缀数组模板解释及补全
相信很多初学后缀数组的ACMer在学习蓝书中的后缀数组部分遇到了一些障碍,可能像我一样看明白了P219 --220的讲解和算法,百度了基数排序的方法,然后被卡在P221的代码上了,本文目的即分享我对这 ...
- 后缀数组模板及代码详解
后缀数组代码详解 上图中存在直边和斜边,下文会用到. #include <cstdio> #include <cstring> #include <iostream> ...
- 【洛谷3865】 【模板】ST表(猫树)
传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里 转载于:https://www.cnblogs.com/ml ...
- UOJ #35. 后缀排序 后缀数组 模板
http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. 1 #include<i ...
最新文章
- 中体骏彩C++面试题
- edgeR基因表达差异分析
- 三星台积电大笑 LG弃自研CPU英特尔代工遭重创
- 基于Vue.js的精选壁纸推荐单页应用
- 得到 yyyy/mm/dd 格式时间
- 钢铁苍穹html5,自定义网站搜索教程
- JDBC(二)驱动程序类型发展历程
- IOS中扩展机制Category和associative
- OpenBUGS抽样数据基本操作
- 190112每日一句
- ABC三类地址、子网掩码及子网划分
- 几款少儿编程软件介绍
- 21世纪八大新兴技术领域对美国战略威慑的影响
- 自定义 View 实现汉字笔顺动画
- 杂谈 之 闲来无事(三)
- php安装时候的源是什么,Windows安装源无效怎么办
- ps 入门 传智播客_播客快速入门指南
- MYSQL--表分区、查看分区
- 多源bfs Spicy Restaurant
- 电信运营商知多少(美国篇)
热门文章
- 自动混合精度(AMP)介绍与使用【Pytorch】
- 深度学习中Flatten层的作用
- 【深度学习】深度神经网络框架的INPUT PROCESS
- 【深度学习入门到精通系列】Gamma变换(校正)
- 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY9-聚类
- FCN-TensorFlow完整代码Github
- 常数据成员 ,常函数
- ubuntu分屏软件_ubuntu14.04终端分屏terminator的安装使用与配置
- JAVA中一维数组的作用,JAVA中一维数组和二维数组的定义
- Springboot解决IDEA读取properties配置文件的中文乱码问题