首页 > 其他分享 >后缀数组

后缀数组

时间:2022-09-05 13:13:31浏览次数:73  
标签:后缀 数组 排名 sa rk 性质

https://oiwiki.org/string/sa/

性质 1:

\(sa[rk[i]]=rk[sa[i]]\) 翻译一下,即记 i 的排名为 \(k\),\(sa[k]=i\),排名为 \(i\) 的后缀的排名为 \(i\)。

性质 2:

$ \forall x\in [1,n],i\le x,j<i,LCP(sa[x],sa[i])>LCP(sa[x],sa[j])$

即对于排名为 \(x\) 的后缀,离得越近,LCP 越大。

考虑反证,即 \(LCA(sa[x],sa[i])<LCP(sa[x],sa[j])\),记左边项为 \(L\),不妨令右边为 \(L+1\),则 \(sa[j]:[1,L+1]=sa[x]:[1,L+1]\),因为 \(j<i\),所以显然有 \(sa[i]:[L+1]>sa[j]:[L+1],sa[i]:[L+1]<sa[x]:[L+1]\),显然只能取到空集。

性质 3

爷懒得写。。

标签:后缀,数组,排名,sa,rk,性质
From: https://www.cnblogs.com/xugangfan/p/16657735.html

相关文章

  • Day06__数组
    数组数组的定义数组的声明和创建packagearray;//数组的声明和创建publicclassDemo01{publicstaticvoidmain(String[]args){int[]nums;//......
  • Stream流进行数组排序
    ​考虑一个数组:int[]nums={9,6,5,7,4,8,3,1,2};对于数组,列举几个转换Stream流的操作及返回值://返回Stream对象,但泛型为int[]数组Stream<int[]>nums1=Stream.of(n......
  • 数组和字符串的相互转换
      var arr = [1, 2, 3, 4];    var arr2 = arr;    var str = arr.toString(); // 将数组转换为字符串    console.log(str); // 1,2,......
  • 数组的基本用例
    数组的基本用例int[]arr={1,7,3,4,5};//定义一个数组遍历并打印数组内所有元素for(inti=0;i<arr.length;i++){System.out.println(arr[i]);......
  • 通过 Infinity 和 -Infinity 查找数组中最大和最小值
    functionfindMaxNum(numbers){letmax=-Infinity;for(constnofnumbers){if(n>max){max=n;}}returnmax;}functionfindMi......
  • 数组去重的几种方式
    1、利用Map数据结构去重1letarr=[1,2,3,4,3,2,3,4,6,7,6];2letunique=(arr)=>{3letseen=newMap();4returnarr.filter((item......
  • 数组初始化
    memset(a,false,sizeof(a));//将bool型a数组初始化为false0x3f3f3f3f//INT_MAX的一半memset(a,0x3f3f3f3f,sizeof(a));//将a数组初始化为0x3f3f3f3fmemset(a,0,sizeo......
  • 动态数组
    动态数组1.vector1.1vector说明vector是向量类型,可以容纳许多类型的数据,因此也被称为容器(可以理解为动态数组,是封装好了的类)进行vector操作前应添加头文件......
  • 一维数组
    一#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta[3]; cin>>a[0]; cin>>a[1]; cin>>a[2]; cout<<a[0]<<endl; cout<<a[1]<<endl;......
  • 二维数组
    (一)a[0]a[1]a[2]a[3]a[4]a[0][1]a[1][1]a[2][1]a[3][1]a[4][1]a[0][2]a[1][2]a[2][2]a[3][2]a[4][2]a[0][3]a[1][3]a[2][3]a[3][3]a[4][3]......