题目: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 后缀数组模板相关推荐

  1. 洛谷P3809 后缀排序【后缀数组】【模板】

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

  2. 【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1031 [题意] [题解] 后缀数组模板题; 把整个字符串扩大一倍. 即长度乘2 然后搞 ...

  3. 后缀数组 java实现_后缀数组模板 - java开发指南博客 【转载】 - ITeye博客

    //后缀数组模板 int wa[maxn],wb[maxn],wv[maxn],ws[maxn];//这些都是需要用到的中间变量 int cmp(int *r,int a,int b,int l) { ...

  4. 【后缀数组】洛谷P3809模板题

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

  5. 后缀数组模板 hdu1403

    题意:就是让你求两个字符串的最大子串 #include <bits/stdc++.h> const int maxn=200005; using namespace std; int s[ ...

  6. 刘汝佳蓝书后缀数组模板解释及补全

    相信很多初学后缀数组的ACMer在学习蓝书中的后缀数组部分遇到了一些障碍,可能像我一样看明白了P219 --220的讲解和算法,百度了基数排序的方法,然后被卡在P221的代码上了,本文目的即分享我对这 ...

  7. 后缀数组模板及代码详解

    后缀数组代码详解 上图中存在直边和斜边,下文会用到. #include <cstdio> #include <cstring> #include <iostream> ...

  8. 【洛谷3865】 【模板】ST表(猫树)

    传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里 转载于:https://www.cnblogs.com/ml ...

  9. UOJ #35. 后缀排序 后缀数组 模板

    http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. 1 #include<i ...

最新文章

  1. 中体骏彩C++面试题
  2. edgeR基因表达差异分析
  3. 三星台积电大笑 LG弃自研CPU英特尔代工遭重创
  4. 基于Vue.js的精选壁纸推荐单页应用
  5. 得到 yyyy/mm/dd 格式时间
  6. 钢铁苍穹html5,自定义网站搜索教程
  7. JDBC(二)驱动程序类型发展历程
  8. IOS中扩展机制Category和associative
  9. OpenBUGS抽样数据基本操作
  10. 190112每日一句
  11. ABC三类地址、子网掩码及子网划分
  12. 几款少儿编程软件介绍
  13. 21世纪八大新兴技术领域对美国战略威慑的影响
  14. 自定义 View 实现汉字笔顺动画
  15. 杂谈 之 闲来无事(三)
  16. php安装时候的源是什么,Windows安装源无效怎么办
  17. ps 入门 传智播客_播客快速入门指南
  18. MYSQL--表分区、查看分区
  19. 多源bfs Spicy Restaurant
  20. 电信运营商知多少(美国篇)

热门文章

  1. 自动混合精度(AMP)介绍与使用【Pytorch】
  2. 深度学习中Flatten层的作用
  3. 【深度学习】深度神经网络框架的INPUT PROCESS
  4. 【深度学习入门到精通系列】Gamma变换(校正)
  5. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY9-聚类
  6. FCN-TensorFlow完整代码Github
  7. 常数据成员 ,常函数
  8. ubuntu分屏软件_ubuntu14.04终端分屏terminator的安装使用与配置
  9. JAVA中一维数组的作用,JAVA中一维数组和二维数组的定义
  10. Springboot解决IDEA读取properties配置文件的中文乱码问题