先玩柿子,发现可以拆开,前半部分可以瞬间求出,于是只求后半部分

  然后抄板子就好了,完结撒花!

  下边是个人口胡,因为已经被虐爆头脑不清醒了

  定义:LCP(a,b)为排名为a,b两个后缀的最长公共前缀

  证明1:LCP(i,k)=min(LCP(i,j),LCP(j,k)),(i<=j<=k)

    sa[i]和sa[j]的前LCP(i,j)个字符相等,sa[j]和sa[k]的前LCP(j,k)个字符相等,所以LCP(i,k)不会小于右式。

    然后(skyh:显然。)因为后缀们已经被排好序,所以不存在形如$\left\{ \begin{array}{cc}a&b&c\\a&b&d&e\\a&b&c&e \end{array} \right.$
的后缀,一旦在中间有LCP的缩小,将来不会再次复原,所以LCP(i,k)不会大于右式。

    所以左式等于右式。

  证明2:LCP(i,k)=min(LCP(j,j-1)),i<=j<=k

    由证明1,LCP(i,k)=min(LCP(i,i+1),LCP(i+1,k))

              =min(LCP(i,i+1),LCP(i+1,i+2),LCP(i+2,k))

              ......    

    于是左式等于右式。

  定义:height[i]=LCP(i,i-1),h[i]=height[rk[i]]

    注意左i是排名,右i是位置

  证明口胡3:h[i]>=h[i-1]-1

    不妨设 rk[k-1]=rk[i-1]-1,则h[i-1]==LCP(rk[k-1],rk[i-1])。

     如果char[k-1]!=char[i-1],那么h[i-1]=0,上式显然成立

     如果char[k-1]==char[i-1],那么同时去掉char[k-1]和char[i-1],string[k-1]变成string[k],string[i-1]变成string[i],显然LCP(rk[i],rk[k])==h[i-1]-1,而且由于rk[k-1]<rk[i-1],rk[k]<rk[i],所以前一句应该写成LCP(rk[k],rk[i])==h[i-1]-1了。

    由证明2,LCP(rk[k],rk[i])<=LCP(rk[i]-1,rk[i]),即LCP(rk[k],rk[i])<=h[i]

    等量代换,h[i]>=h[i-1]-1

    这个定理是求h数组的复杂度保证。

  求sa流程:

    1.将原字符作为第一关键字塞进桶里,无第二关键字

    2.桶排序,得到初始sa

    3.处理出按第二关键字排名进行排序的第一关键字位置(起始位置)

    4.桶排序,注意当第一关键字相同时按第二关键字排序

    5.排序结果作为下一次倍增的第一关键字,注意判断相等

    6.判断排名数量,如果有并列,重复3~5

    7.没有并列,则已经求出sa

  求rank流程:

    1.这还用求吗一个for就把sa变成rank

  求height流程:

    1.首先提醒自己h数组是根据下标(位置)转移的,不是排名

    2.枚举位置,初始为0

    3.根据证明3,可以以h[i-1]-1为起点,然后暴力拓展

    4.一个for循环结束,求出height或h

    注意当rk[i]==1时,证明3所证的定理就萎了..只能特判它等于0(有没有发现证明过程中运用了一个k,还说rk[k]<rk[i])(其实i==1时定理也不成立,因为用到了i-1,但是因为k初始就是0,它一开始就是暴力...)

    upd:我在写上一段的时候突然发现,定理成立需要很多条件...例如i>1,k>1,rk[i]>1,rk[i-1]>1...而我并没有办法控制这些全部满足时才使用定理求解...所以我在此恳求看到此处的oier们..谁能解决这个问题...谢谢了...(雾

   

差异---虐爆了yxs的 后缀数组裸题 板子题 单调栈的简单应用 字符串的基础理解考察题的更多相关文章

  1. 【bzoj3238】差异[AHOI2013](后缀数组+单调栈)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3238 这道题从大概半年以前就开始啃了,不过当时因为一些细节没调出来,看了Sakits神犇 ...

  2. [AHOI2013] 差异 - 后缀数组,单调栈

    [AHOI2013] 差异 Description 求 \(\sum {len(T_i) + len(T_j) - 2 lcp(T_i,T_j)}\) 的值 其中 \(T_i (i = 1,2,... ...

  3. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  4. 后缀数组(suffix array)详解

    写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...

  5. 【BZOJ-4278】Tasowanie 后缀数组 + 归并

    4278: [ONTAK2015]Tasowanie Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 164  Solved: 80[Submit][S ...

  6. ural 1297(后缀数组+RMQ)

    题意:就是让你求一个字符串中的最长回文,如果有多个长度相等的最长回文,那就输出第一个最长回文. 思路:这是后缀数组的一种常见的应用,首先把原始字符串倒转过来,然后接在原始字符串的后面,中间用一个不可能 ...

  7. hdu 4691 Front compression (后缀数组)

    hdu 4691 Front compression 题意:很简单的,就是给一个字符串,然后给出n个区间,输出两个ans,一个是所有区间的长度和,另一个是区间i跟区间i-1的最长公共前缀的长度的数值的 ...

  8. poj2774 Long Long Message 后缀数组求最长公共子串

    题目链接:http://poj.org/problem?id=2774 这是一道很好的后缀数组的入门题目 题意:给你两个字符串,然后求这两个的字符串的最长连续的公共子串 一般用后缀数组解决的两个字符串 ...

  9. Java后缀数组-求sa数组

    后缀数组的一些基本概念请自行百度,简单来说后缀数组就是一个字符串所有后缀大小排序后的一个集合,然后我们根据后缀数组的一些性质就可以实现各种需求. public class MySuffixArrayT ...

随机推荐

  1. ELK 学习笔记之 elasticsearch基本概念和CRUD

    elasticsearch基本概念和CRUD: 基本概念: CRUD: 创建索引: curl -XPUT 'http://192.168.1.151:9200/library/' -d '{" ...

  2. 为你的Mysql排序查询增加一个排序号

    排序号,在需要排序的查询中比较常见,今天再一次遇到这种场景,不常写,所以上手比较生疏,记录一下,或许对更多的人也有用处. 起初在网上进行了一下简单的搜索,但是文章都挺乱,可读性都不太高,经过一番调查, ...

  3. Mysql Hash索引和B-Tree索引区别(Comparison of B-Tree and Hash Indexes)

    上篇文章中说道,Mysql中的Btree索引和Hash索引的区别,没做展开描述,今天有空,上Mysql官方文档找到了相关答案,看完之后,针对两者的区别做如下总结: 引用维基百科上的描述,来解释一下这两 ...

  4. Vue-懒加载(判断元素是否在可视区域内)

    上公式: 元素距离顶部高度(elOffsetTop) >= dom滚动高度(docScrollTop) 并且元素距离顶部高度(elOffsetTop) < (dom滚动高度 + 视窗高度) ...

  5. Dubbo学习系列之十五(Seata分布式事务方案TCC模式)

    上篇的续集. 工具: Idea201902/JDK11/Gradle5.6.2/Mysql8.0.11/Lombok0.27/Postman7.5.0/SpringBoot2.1.9/Nacos1.1 ...

  6. Git版本控制之ubuntu搭建Git服务器

    Git是一个开源的分布式版本控制系统,可以有效.高效的处理从很小到非常大的项目版本管理.使得开发者可以通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库,也可以将代码提交到Git服务 ...

  7. 基于STM32F429和HAL库的CAN收发例程

    1.CAN协议介绍 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议.在当前的汽车产业中,出于对安全性.舒适性.方便性.低公 ...

  8. Mac 10.14 安装抓包工具Fiddler

    环境安装 第一步: 首先,Mac下需要使用.Net编译后的程序,需要用到跨平台的方案Mono(现阶段微软已推出跨平台的方案.Net Core,不过暂时只支持控制台程序).安装程序可以从http://w ...

  9. 神奇的Java僵尸(defunct)进程问题排查过程

    现象描述 大概1个月多以前 在启动脚本中增加了tail -f 用来启动后追踪日志判断是否启动成功 后发现无法执行shutdown.sh(卡住 利用curl) 然后无奈使用kill -9 但通过ps - ...

  10. 全面系统Python3入门+进阶课程 ✌✌

    全面系统Python3入门+进阶课程 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 无论是大数据.人工智能还是机器学习,Python都是最热门的首选语言 ,这 ...