后缀数组模板

后缀数组(Suffix Array) 后缀数组(Suffix Array)标程。采用DA算法。RMQ预处理询问。 立即下载

参考大神:罗穗骞论文

基本定义
子串:字符串 S 的子串 r[i..j],i≤j,表示 r 串中从 i 到 j 这 一 段 ,
也就是顺次排列 r[i],r[i+1],...,r[j]形成的字符串。
后缀:后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字
4
IOI2009 国家集训队论文
符串
r 的从
后缀数组
第 i 个字符开始的后缀表示为

Suffix(i) , 也 就 是
Suffix(i)=r[i..len(r)]。
大小比较:关于字符串的大小比较,是指通常所说的“字典顺序”比较,也
就是对于两个字符串 u、v,令 i 从 1 开始顺次比较 u[i]和 v[i],如果
u[i]=v[i]则令 i 加 1,否则若 u[i]<v[i]则认为 u<v,u[i]>v[i]则认为 u>v
(也就是 v<u)
,比较结束。如果 i>len(u)或者 i>len(v)仍比较不出结果,那
么若
len(u)<len(v) 则 认 为
u<v , 若 len(u)=len(v) 则 认 为
u=v , 若
len(u)>len(v)则 u>v。
从字符串的大小比较的定义来看, 的两个开头位置不同的后缀 u 和 v 进
S
行比较的结果不可能是相等,因为 u=v 的必要条件 len(u)=len(v)在这里不可
能满足。
后缀数组:
后缀数组 SA 是一个一维数组,
它保存 1..n 的某个排列 SA[1],
SA[2],......,SA[n],并且保证 Suffix(SA[i]) < Suffix(SA[i+1]),1≤i<n。
也就是将 S 的 n 个后缀从小到大进行排序之后把排好序的后缀的开头位置顺
次放入 SA 中。
名次数组:名次数组 Rank[i]保存的是 Suffix(i)在所有后缀中从小到大排
列的“名次”。
简单的说,后缀数组是“排第几的是谁?”,名次数组是“你排第几?”。容
易看出,后缀数组和名次数组为互逆运算



2倍增法:


int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}
void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=0;i<m;i++) ws[i]=0;
for(i=0;i<n;i++) ws[x[i]=r[i]]++;
for(i=1;i<m;i++) ws[i]+=ws[i-1];
for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;
for(j=1,p=1;p<n;j*=2,m=p)
{
for(p=0,i=n-j;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0;i<n;i++) wv[i]=x[y[i]];
for(i=0;i<m;i++) ws[i]=0;
for(i=0;i<n;i++) ws[wv[i]]++;
for(i=1;i<m;i++) ws[i]+=ws[i-1];
for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
return;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

const int maxn = 1000;
int rank[maxn],wb[maxn],wv[maxn],wss[maxn];
int n;

bool cmp(int *r,int a,int b,int l)
{
    return r[a]==r[b] && r[a+l]==r[b+l];
}

void da(int *r,int *sa,int n,int m)
{
    int i,j,p,*x=rank,*y=wb,*t;
    for(i=0;i<m;i++) wss[i]=0;
    for(i=0;i<n;i++) wss[x[i]=r[i]]++;
    for(i=1;i<m;i++) wss[i]+=wss[i-1];
    for(i=n-1;i>=0;i--)
       sa[--wss[x[i]]]=i;

    for(j=1,p=1;p<n;j*=2,m=p)
    {
        for(p=0,i=n-j;i<n;i++) y[p++]=i;
        for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
        for(i=0;i<n;i++) wv[i]=x[y[i]];
        for(i=0;i<m;i++) wss[i]=0;
        for(i=0;i<n;i++) wss[wv[i]]++;
        for(i=1;i<m;i++) wss[i]+=wss[i-1];
        for(i=n-1;i>=0;i--) sa[--wss[wv[i]]]=y[i];
        for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
        x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
    }
    return;
}

int main()
{
    int a;
    a = 2;
    char s[1000],l;
    int r[1000],sa[1000],i;
    while(scanf("%s",s) == 1)
    {
        puts(s);
        l = strlen(s);   l++;

        for(i=0; i<l-1; i++) r[i] = s[i]-'a'+1;
        r[l-1] = 0;

        da(r,sa,l,27);

        //------------------------------------------
        for(i=0; i<l-1; i++)  // rank[i] : suffix(i)排第几
           printf("rank[%d] =  %d\n",i,rank[i]);
        printf("\n");
        for(i=0; i<l; i++)   // sa[i] : 排在第i个的是谁
           printf("sa[%d] =  %d\n",i,sa[i]);
        //------------------------------------------
    }
    return 0;
}


33DC3 算法

#define F(x) ((x)/3+((x)%3==1?0:tb))
#define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2)
int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
int c0(int *r,int a,int b)
{return r[a]==r[b]&&r[a+1]==r[b+1]&&r[a+2]==r[b+2];}
int c12(int k,int *r,int a,int b)
{if(k==2) return r[a]<r[b]||r[a]==r[b]&&c12(1,r,a+1,b+1);
else return r[a]<r[b]||r[a]==r[b]&&wv[a+1]<wv[b+1];}
void sort(int *r,int *a,int *b,int n,int m)
{
int i;
for(i=0;i<n;i++) wv[i]=r[a[i]];
for(i=0;i<m;i++) ws[i]=0;
for(i=0;i<n;i++) ws[wv[i]]++;
for(i=1;i<m;i++) ws[i]+=ws[i-1];
for(i=n-1;i>=0;i--) b[--ws[wv[i]]]=a[i];
return;
}
void dc3(int *r,int *sa,int n,int m)
{
int i,j,*rn=r+n,*san=sa+n,ta=0,tb=(n+1)/3,tbc=0,p;
r[n]=r[n+1]=0;
for(i=0;i<n;i++) if(i%3!=0) wa[tbc++]=i;
sort(r+2,wa,wb,tbc,m);
sort(r+1,wb,wa,tbc,m);
sort(r,wa,wb,tbc,m);
for(p=1,rn[F(wb[0])]=0,i=1;i<tbc;i++)
rn[F(wb[i])]=c0(r,wb[i-1],wb[i])?p-1:p++;
if(p<tbc) dc3(rn,san,tbc,p);
else for(i=0;i<tbc;i++) san[rn[i]]=i;
for(i=0;i<tbc;i++) if(san[i]<tb) wb[ta++]=san[i]*3;
if(n%3==1) wb[ta++]=n-1;
sort(r,wb,wa,ta,m);
for(i=0;i<tbc;i++) wv[wb[i]=G(san[i])]=i;
for(i=0,j=0,p=0;i<ta && j<tbc;p++)
sa[p]=c12(wb[j]%3,r,wa[i],wb[j])?wa[i++]:wb[j++];
for(;i<ta;p++) sa[p]=wa[i++];
for(;j<tbc;p++) sa[p]=wb[j++];
return;
}


求height[];   height 数组:定义 height[i]=suffix(sa[i-1])和 suffix(sa[i])的最长公
共前缀,也就是排名相邻的两个后缀的最长公共前缀

int rank[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{
int i,j,k=0;
for(i=1;i<=n;i++) rank[sa[i]]=i;
for(i=0;i<n;height[rank[i++]]=k)
for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
return;
}


后缀数组--许智磊 立即下载

相关推荐

【tensorrt】——深入解析TypeError: pybind11::init()报错:CUDA版本冲突与解决方案

本文深入解析了TensorRT中常见的TypeError: pybind11::init()报错问题,重点探讨了CUDA版本冲突的根源与解决方案。通过实际案例展示了PyTorch与TensorRT的版本兼容性问题诊断方法,并提供了conda环境管理、环境变量配置等实用修复技巧,帮助开发者有效解决CUDA初始化失败问题。

ggg99的专栏 272

后缀数组 - 模板详解

详解后缀数组模板

逐梦者 581

Mac版UltraEdit 18.00.0.19破解教程:终端一行命令搞定(附版本适配指南)

本文为Mac用户提供了UltraEdit的合法替代方案与授权指南,强调破解软件的法律风险和安全隐忧。推荐使用VS Code、Sublime Text等开源或商业编辑器,结合终端工具如Vim/Neovim,实现高效文本编辑。同时详细介绍了UltraEdit的官方授权选项,帮助开发者在遵守软件许可的前提下提升工作效率。

k9l0m1的博客 357

后缀数组模板之高度数组

rk[i]:表示原始下标为i的后缀字符串排序后对应的下标(也就是原始下标为i的后缀字符串排序后为第rk[i]小)height[i]:表示排名为i和i-1的后缀字符串的最长公共前缀的长度,注意这里的i是排名,不是原始下标。

qq_53237241的博客 731

一文吃透 SAP HANA JSON Document Store:从架构到实战的完整指南

本文详细介绍了SAP HANA的JSON Document Store功能,包括其定位、架构、典型场景以及具体使用方法。文章首先分析了半结构化数据场景下传统关系模型的局限性,说明Document Store如何通过集合(Collection)存储JSON文档来提供灵活性。随后详细阐述了启用方式、SQL语法、与Column Store的联动机制,并提供了大量可直接复用的实战案例。特别强调了Document Store作为HANA内建服务的优势,包括企业级一致性、备份恢复等能力。最后给出了数据类型处理和跨引擎协

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 201

BoT-SORT实战:手把手教你实现BoT-SORT训练和测试

文章目录摘要1、数据准备2、配置BoT-SORT环境2.1、获取代码2.2、创建虚拟环境2.3、安装必要的包2.3.1、安装pytorch2.3.2、安装cython2.3.3、安装Cython-bbox2.3.4、安装faiss2.3.5、安装其他的包3、训练3.1、生成REID数据集3.2、预训练模型3.2.1、ByteTrack预训练模型3.2.2、REID预训练模型3.3、开始训练4、如何更改FASTREID的BackBone?5、测试5.1、测试视频5.2、测试摄像头5.3、多类别测试 摘要 Bo

m0_47867638的博客 2298

后缀数组_DC3(模板大全)

/* suffix数组:第i位到最后的字符串 sa数组:将排序后的后缀的开头位置顺次放入SA中,称为后缀数组 rank数组:令rank[i]保存suffix[i]在排序中的名次,名次数组 */ #include "stdio.h" #include "string.h" #define maxn 20004 #define maxm 1000005 #define F(x) ((x)/3+((x

穿袜子的流氓兔的专栏 1488

数据结构(超详细讲解!!)第十七节 队列应用(杨辉三角)

杨辉三角

2201_76115387的博客 1375

后缀数组

后缀数组模板: const int maxn = 1e5+5;//开总串长度,不要忘记连接符 int wa[maxn],wb[maxn],wsf[maxn],wv[maxn],sa[maxn]; int rank[maxn],height[maxn],s[maxn]; char str1[maxn],str2[maxn]; //sa:字典序中排第i位的起始位置在str中第sa[i] sa[1~...

qq_2992427261 347

路径规划 | 图解A*、Dijkstra、GBFS算法的异同(附C++/Python/Matlab仿真)

图解A*、Dijkstra、GBFS算法原理,分析三种算法异同,提供C++/Python/Matlab仿真实现

FRIGIDWINTER的博客 2万+

从 PI Start Page 到 ESR、ID、SLD,重新理解 SAP PI 的工具访问体系

摘要 SAP PI工具入口设计反映了系统核心分工逻辑。不同角色通过特定入口访问专属工具:集成顾问使用Enterprise Services Builder设计接口,BASIS管理员通过SAP NetWeaver Administrator监控运行状态,技术顾问在Integration Builder配置路由,系统维护则需进入System Landscape Directory。这种设计体现了PI平台将工作划分为管理、技术配置、设计、业务配置和监控五大领域。尤其值得注意的是技术配置与业务配置的连续性关系,如I

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1872

【模板】后缀数组

#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> //Accepted??? using namespace std; const int N=2e5+5; const int Maxchar=26; char s[N],a[N]; int n,m,nn,num,x[N],y[N],c[N],sa[N]; int h[N],height[N],rk[N]; int f[

cqbzlydd的博客 88

系统安装(kuntaiR522 kvm安装)

鲲泰R522服务器kvm安装rocky

weixin_46396917的博客 1821

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

【洛谷 P3809】 【后缀数组】【模板】后缀排序 标题 解题思路 嗯。。。这是道模板题 雾里看花状态,咱就给点注释吧 我看的是这篇题解 代码 #include<iostream> #include<cstdio> using namespace std; string s; int n,m=1000; int z[1001000],w[1000100],c[1000100],sa[1001000],wa[1000100],wb[1000100]; bool cmp(int *

Y的博客 867

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

洛谷:P3809 【模板】后缀排序(后缀数组模板)

P3809 【模板】后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题。 题目描述 读入一个长度为nn的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置。位置编号为11到nn。 输入输出格式 输入格式:...

dft539533的博客 246

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

后缀数组入门,后缀数组模板整理

我自己懒得写,就是想写个博客保存下大佬的博客地址 点这 模板题 大佬的模板: #include<iostream> #include<string> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include <set&g...

青春苦瓜 183

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

浅谈后缀数组 + 模板

            --------- 以上来自 https://blog.youkuaiyun.com/YxuanwKeith/article/details/50636898       ---------以上来自 https://www.cnblogs.com/victorique/p/8480093.html 一些我的理解 刚刚学了后缀数组 , 认为造成我理解的最大...

FSYo 的博客 1020

后缀数组的初始模板

//后缀数组模板 #include <iostream> #include <cstring> #include <algorithm> #include <string.h> using namespace std; const int maxn = 1000010; int n; char s[maxn]; int sa[maxn],rank[maxn],height[maxn]; int p[maxn],tmp[maxn],cnt[maxn]; bo

rwrsgg的博客 142

后缀数组模板和最最最常用的思路

虽然不能理解,但好歹做个模板,方便以后copy23333 #include <bits/stdc++.h> using namespace std; /* 1.判断一个串s是否为p的后缀 2.多模式串匹配 3.求原串的后缀的最长公共前缀\ */ const int maxn=10000+10; char s[maxn];//原串 int sa[maxn],t[...

Q755100802的博客 207
上一篇: HDU3518后缀数组
下一篇: 处世态度(有空的时候拿出来读一下)
SprintfWater
博客等级 码龄15年 242粉丝 139原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值