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

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

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

  定义: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. springmvc处理局部异常和全局异常

    springmvc通过HandlerExceptionResolver(是一个接口,在spring-webmvc依赖下)处理程序异常,包括处理器异常.数据绑定异常以及处理器执行时发生的异常.Handl ...

  2. Spring Boot 2.X(七):Spring Cache 使用

    Spring Cache 简介 在 Spring 3.1 中引入了多 Cache 的支持,在 spring-context 包中定义了org.springframework.cache.Cache 和 ...

  3. 从0开始学FreeRTOS-(列表与列表项)-3

    # FreeRTOS列表&列表项的源码解读     第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像. 在`FreeRTOS`中,列表与列表项使用得非常多 ...

  4. Oracle数据库实验一建立数据库

    实验日期:   2019 年  09 月  24  日 实验报告日期:   2019  年  09 月  28 日 一.      实验目的 熟悉oracle环境: 熟练掌握和使用PL-SQL建立数据 ...

  5. Windows 8.1硬盘安装Ubuntu 14.04双系统参考教程及多硬盘注意事项

    本文来自:http://www.linuxidc.com/Linux/2015-08/122140.htm,此处仅做收藏. Windows 8.1硬盘安装Ubuntu 14.04双系统参考教程及多硬盘 ...

  6. Python中的可变对象与不可变对象、浅拷贝与深拷贝

    Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...

  7. Java序列化总结(最全)

    概念 实现 Serializable 接口, 它只是一个标记接口,不实现也能够进行序列化 RMI: 远程方法调用 RPC: 远程过程调用 序列化ID 解决了序列化与反序列出现代码不一致的问题, 不一致 ...

  8. drf框架接口文档

    drf框架接口文档 REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 一.安装依赖 pip insta ...

  9. metasploit(MSF)渗透平台命令大全

    转自互联网 记录以备后用 show exploits 列出metasploit框架中的所有渗透攻击模块. show payloads 列出metasploit框架中的所有攻击载荷. show auxi ...

  10. Potato土豆win综合提权

    0x01 NBNS和WDAP NBNS: 在 Windows 系统中的另外一种名称就是 NetBIOS 名称,准确的说 NetBIOS 名称并非是一种名字系统,而是 Windows 操作系统网络的一个 ...