后缀数组各个变量含义

别再死记硬背了!一张图帮你理清Linux exec函数族(execl/execv)的命名与用法 本文深入解析Linux exec函数族(execl/execv)的命名规律与使用技巧,帮助开发者彻底掌握进程替换技术。通过对比6种函数的参数传递方式(列表/数组)、PATH搜索和环境变量控制等特性,提供实战应用示例和常见陷阱规避方法,是Linux系统编程的必备指南。 阅读详情
  1. sa[i] = j: 代表第i名的后缀是[j,n]。
  2. rank[i] = j: 代表后缀[i,n]是第j名。
  3. height[i] = j: 第i名与第i-1名的LCP是j。

在这里插入图片描述

https://ac.nowcoder.com/acm/contest/551/C
询问长度大于k的不同子串个数。

每个子串都是一个后缀的前缀,所以一个后缀加入会贡献出n-sa[i]+1个子串。
例如后缀aaabbc,贡献的子串有aaabbc,aaabb,aaab,aaa,aa,a。扣除掉与前面重复出现的子串就是新贡献的子串个数:n-sa[i]+1-height[i]。假设height[i]=1,k=3,height淘汰了a,但是aa也是不满足的,所以对于长度大于k的,只需n-sa[i]+1-max(height[i],k-1)即可。

sa[i]下标从0开始

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+100;
const int M=1e5+100;
int wa[N],wb[N],wv[N],wss[M];
string tr;
int r[N],sa[N];
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++) 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 rankk[N],height[N];
void calheight(int *r,int *sa,int n)
{
    int i,j,k=0;
    for(i=1;i<=n;i++) rankk[sa[i]]=i;
    for(i=0;i<n;height[rankk[i++]]=k)
    for(k?k--:0,j=sa[rankk[i]-1];r[i+k]==r[j+k];k++);
    return;
}
int main()
{
    int n,mm,k;
    int m=1000;
    long long ans;
    cin>>n>>mm;
    cin>>tr;
    for(int i=0;i<n;++i)
        r[i]=(int)(tr[i])+1;
    r[n]=0;
    da(r,sa,n+1,m);
    calheight(r,sa,n);
    ans=0;
   // for(int i = 1; i <= n; ++i) cout << sa[i] << endl;
    for(int i=1;i<=n;++i)
        ans+=max(0,n-sa[i]-max(mm-1,height[i]));
    printf("%lld\n",ans);
    return 0;
}
基于STM32的馆藏文物保存环境监测系统设计与实现 针对馆藏文物保存环境中温湿度、光照、有害气体等参数波动易导致文物损坏的问题,本文设计了一种基于STM32微控制器的馆藏文物保存环境监测系统。该系统以STM32L431RCT6为核心,集成高精度传感器实现多参数实时采集,通过有线与无线结合的通信方式构建监测网络,具备数据存储、异常预警、远程监控等功能。测试结果表明,系统温湿度测量精度分别达±0.2℃、±2%RH,光照与有害气体检测误差≤5%,可满足文物保存环境的高精度监测需求,为文物保护提供科学的数据支撑。 阅读详情

相关推荐

ArcGIS标注太乱?手把手教你用‘要素分类标注’搞定河流分级显示

本文详细介绍了如何在ArcGIS Pro中使用要素分类标注功能实现河流分级显示,解决标注混乱问题。通过数据预处理、分类标注规则定义和高级参数调优,帮助用户打造层次分明、专业清晰的水系地图,提升地图信息传达效率。

weixin_30326741的博客 474

各类型定义的数组的数组名加数字的意思

void main(){ char*p1,*p2,str[50]=”ABCDEFG”; int num[10] ={0}; p1=”abcd”; num+1; strcpy(str+3,p1+3); printf(“%s”,str); } p1,p2是字符指针,它指向一个...

baidu_41878679的博客 7083

Windows如何使用Anaconda 3进行keras环境的配置

** Windows如何使用Anaconda 3进行keras环境的配置 搭建Keras环境* Anaconda3如何安装keras,主要包括下面三步: 1.安装mingw libpython 2.安装theano 3.安装keras 若你还没有按装anaconda,赶紧下载安装吧! 下载途径有两个 (1)Anaconda版本为Anaconda 4.4.0,对应的python版本为3.6,附上An...

Lance_liangliang的博客 1601

【c语言】——关于数组的那些事儿

1.局部变量的定义 答:局部变量是定义在函数体中的变量,内存区域在栈里,数据先进后出,地址下面大上面小。 2.输入一段代码: #include&lt;stdio.h&gt; int main() { int i; int arr[10]; for(i=0;i&lt;=10;i++) { arr[i]=0; printf("%d",i); } return 0; } 它们在栈中的存储位置如图所示(栈...

qq_43412060的博客 499

SAP公司间外协业务流程以及配置说明

SAP公司间外协业务流程以及配置说明

竹大的博客 7166

基于ADRC算法的多旋翼飞行器抗扰动控制实践

本文详细介绍了基于ADRC算法的多旋翼飞行器抗扰动控制实践,通过线性扩张状态观测器(LESO)实时估算风力等扰动,实现提前补偿,显著提升飞行稳定性。文章结合具体案例和工程实现技巧,展示了ADRC在突风条件下的优异表现,为无人机控制提供了高效解决方案。

weixin_29284885的博客 191

java基础九 数组

为了存储同种数据类型的多个值,java中使用了数组这一概念. ------数组的含义: 在java中能存储同一种数据类型(可以是基本数据类型,也可以是引用数据类型)的多个元素的集合,也可以看成是一个容器 ------数组怎么定义? 数据类型[ ] 数组名  =  new 数据类型[数组长度]; 比如: int[ ] arr = new int[5]; int代表数据类型 [

liujiding的博客 481

ChatUI vs Ant Design X 技术选型对比

维度ChatUI优势轻量级、易上手、完美兼容 Ant Design全能型框架、企业级扩展性、深度模型集成局限性功能单一、缺乏高级交互支持学习曲线陡峭、包体积较大最佳实践单独聊天窗口集成整体智能助手系统开发通过对比可见,ChatUI 适合快速实现基础对话功能,而Ant Design X 更适合构建复杂的 AI 驱动应用。实际选择时需结合项目规模、团队技术栈和对交互复杂度的需求综合评估。

四楼没电梯的专栏 2262

数组的 == 与 equals()使用现象及其解释

基本数据类型的数组的 == 使用特点: public static void main(String[] args) { int [] kk = {1,128}; int [] cc = {1,128}; System.out.println(kk == cc); System.out.println(kk[0] == cc[0]); System.out.println(kk[1] == cc[1]); } System.out.println(kk == c

qq_43079667的博客 397

多摄像头场景下 ISP 的同步与调度机制实战解析

在智能手机多摄系统中,主摄、广角、长焦、微距等摄像头的协同工作能力直接决定了影像系统的体验上限。而支撑这一能力的核心之一,正是 ISP 的同步与调度机制。ISP 需要处理多个 Sensor 的输入流、统一时序、资源仲裁、并发调度,并支持在不同模式间快速切换(如预览 → 拍照 → 视频)。本文将基于 Qualcomm、MTK、HiSilicon 平台的实际架构,系统性剖析 ISP 在多摄场景下的时序控制、Pipeline 配置、Buffer 管理与故障恢复机制,并分享实战中的典型问题与调试方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2347

用 Python 和 XGBoost 进行疾病诊断预测

疾病诊断预测是医疗领域的重要研究方向,准确的疾病诊断预测可以帮助医生提前制定治疗方案,提高治疗效果,降低医疗成本。本文章的目的是介绍如何使用 Python 和 XGBoost 算法构建疾病诊断预测模型。范围涵盖了从数据预处理、模型训练到模型评估的整个流程,同时通过实际案例展示如何将该模型应用于疾病诊断预测中。本文首先介绍了疾病诊断预测的背景和 XGBoost 算法的核心概念,然后详细讲解了 XGBoost 算法的原理和具体操作步骤,包括 Python 代码实现。

AI Python 编程之道的博客 1064

数组补充

数组的常见操作 数组元素的遍历 数组常见的角标越界异常 数组元素的反向遍历 获取数组中元素的最大值或最小值 数组元素的反转 参考代码 public class ArrayDemo03 { public static void main(String[] args) { //定义数组 int[] arr = {10, 20, 30, 40, 50}; //遍历数组 /* int length = arr.lengt

weixin_46649583的博客 343

K230目标识别数字提问:模型只能识别近距离的目标,稍远一点就无法正确检测...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1898

POJ 3261 Milk Patterns(后缀数组+二分答案)

题意 给定一个长度为 \(n​\) 的由正整数构成的串和一个整数 \(K​\),求至少出现 \(K​\) 次的串的最长长度(可以重叠)。 \(1 \leq n\leq 20000​\) \(2\leq K\leq n\) 思路 变量及其含义 后缀数组(SA)是一个比较灵活的处理字符串有关问题的算法,它能对一个串的所有后缀进行排序。我们用串 abaaab 作例子,来分析这个算法。 sa(s...

weixin_30675247的博客 83

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

后缀数组

后缀数组 文章目录后缀数组1.各变量的含义2.具体思想3.代码实现及讲解1. 基数排序2.倍增4.精髓:height数组求height数组代码5.模板(无注释版)6.应用1.各变量的含义2.具体思想3.代码实现及讲解1. 基数排序2.倍增4.精髓:height数组求height数组代码5.模板(无注释版)6.应用 后缀数组定义:让人懵逼的有力工具 ,指某一字符串后缀按照字典序的一个排列。sa[i]...

StungYep 533

kmp算法

链接: https://blog.csdn.net/your_answer/article/details/79619406 https://www.cnblogs.com/yjiyjige/p/3263858.html 在这里以第二篇博文为主,补充说明下第二篇博文中某些变量的含义: j代表与i匹配不上时的模式串元素下标,在计算next数组的时候,j代表假设与当前模式串匹配不上时模式串的元...

kekeshu_k的博客 124

(自用)KMP算法中next数组的求解算法

看到站内一篇讲的很明白的文章,本着“能给别人讲明白=自己真正理解”的原则,试着写一篇讲解加深自己的理解next数组:对于字符串S中第j个元素,设其前面的元素组成的子串为S',则next[j]等于S中重合的前缀和后缀的最大长度。前缀:字符串中包含首字符且不包含尾字符的任意子串后缀:字符串中包含尾字符且不包含首字符的任意子串数学表述如下(这是元素下标以1为起始的情况,以0为起始的话都-1就可以了,后面我为了和看的原文一致可以得到next数组值的(除了表示子串和主串失配时子串指针应指向的位置)

qq_24873801的博客 1068

NETCDF文件

概述 NetCDF全称为network Common Data Format,中文译法为“网络通用数据格式”,它是一种面向数组型并适于网络共享的数据描述和编码标准。 NetCDF文件用于存储气象科学中的数据。 NetCDF从公式来说就是f(x,y,z,…)=value。 文件格式 NetCDF文件后缀为.nc,文件中的数据结构包含维(dimensions)、变量(variables)和属性(attributes)三种描述类型,每种类型都会被分配一个名字和一个ID。 一个NetCDF文件的结构包括以下对象:

qq_44955314的博客 847

shell脚本

1.不能用于调用数组 2.不能用于调用${10}以及${10} 以上的位置变量 调用方式1:$变量名 #可以调用所有类型的变量 调用方式2:${变量名}从终端向脚本中输入值的一种方法,通过 $0,$1,$2,$3,...,${10},${11},...,${n}来获取。var=123 var=$变量名 #1.变量的值不能有空格 #2.可以直接调用变量。var='123 456' #1.变量的值可以有空格 #2.不可以调用变量。var="123 $变量名" #1.变量的值可以有空格 #2.可以调用变量。

weixin_72152375的博客 70

数据结构-串-KMP算法核心:手把手教你构建Next数组(从原理到实现)

本文深入解析KMP算法中的Next数组构建原理与实现方法,通过手工计算示例和Python代码演示,帮助读者掌握字符串匹配的核心技术。详细讲解Next数组的优化策略(如NextVal)及常见误区,并给出KMP完整实现代码,适用于文本搜索、日志分析等场景,显著提升字符串处理效率。

weixin_33146151的博客 205

【洛谷 P2375】 【kmp】 动物园

【洛谷 P2375】 【kmp】 动物园 题目 解题思路 学过kmp的小朋友们肯定知道next维护的是既是它前缀又是它后缀的长度 题目讲的一级棒 那么我们可以从这推出一个弱化版的num num求的是不重叠的又是前缀又是后缀的长度 设一个ans求的是可重叠的又是前缀又是后缀的长度 求ans[i]即是ans[next[i]]+1 next[i]本身就既是它的前缀也是它的后缀,所以next[i]的前缀也会是i的前缀 因为最后num求的是不重叠的 所以我们要保证k 就是i最长的一个不重叠前缀的长度 那么可以

Y的博客 325

kmp算法pmt数组构建的理解

我们找到这样一个更短的火车头,看看在更短的火车头后面加车厢,是否能够增长火车头的长度,如果不行,那就再找一个更更短的,这样一直循环,直到找到一个符合条件的公共前后缀,或者没找到,那pmt[i]就为0(公共前后缀的长度为零)。再回过头来看这句代码:length = lps[length - 1],length是当前公共前后缀的长度,lps[length-1]是前length-1个字符的公共前后缀的长度,也就是前缀的前缀的长度。前缀=后缀,前缀的前缀=前缀的后缀,后缀的前缀=后缀的后缀,

J951357j的博客 377

java基础4--常量和变量、标识符、数据类型

常量的概念和分类 常量的概念: 在程序执行的过程中,值不会发生改变的量 在计算机程序运行时,不会被程序修改的量 java中的常量: 字面值常量 自定义常量 字面值常量: 字符串常量 整数常量 小数常量 字符常量 布尔常量(只有true和false) 空常量(不可以直接打印null,会报错) 变量的概念和定义格式 概念: 定义格式:数据类型 变量名=初始化值; 要知道的是:声明一个变量的话,首先要确定它的数据类型,确定后进行声明变量,相当于在内存中开辟一块空间,然后再将值装入开辟的内存中。 要

weixin_45455503的博客 224

荆楚理工学院C语言期末试题,C语言期末复习题

该楼层疑似违规已被系统折叠隐藏此楼查看此楼发1. 正确的自定义标识符是A.a=2B.a+bC.nameD.default2. 变量的指针含意是指变量的A.值B.地址C.存储D.名字3. C语言中最简单的数据类型包括A.整型、实型、逻辑型B.整型、实型、字符型C.整型、字符型、逻辑型D.整型,实型,逻辑型,字符型4. 在C语言中,正确的说法是A.函数...

weixin_42400643的博客 994

后缀数组(Suffix Array)

啥是后缀数组?难不难? 后缀数组看上去是一个很高深,很玄妙的东西。 但首先,我们要树立一个观点:它!不难!! 实际上,他也真的不难。难的只是其中一个想法的操作。除此以外,不难。 后缀数组的概念 首先,我们需要了解一下什么是后缀 后缀,顾名思义,缀在后面的东西。在字符串中,就是缀在字符串后面的东西,大家可以联系一下英语单词中的后缀来理解。 举个例子 字符串:abaab 后缀分别有: abaab, ...

一个小渣渣的博客:) 1519

后缀数组:原理和实现

后缀数组(Suffix Array)是某一字符串的所有后缀按照字典序的一个排列。本文数组的索引从0开始。称s[j..len(s)-1]为后缀j。sa[i] = j,表示原串的所有后缀按字典序排列,排在第i个的是后缀j。一个字符串的后缀数组是唯一的。 sa根据排名查后缀编号,与之对应的是rank数组,根据后缀编号查排名。sa[i] = j <=> rank[j] = i。

chrt's blog 7998
上一篇: P2279 [HNOI2003]消防局的设立 (贪心,树上覆盖)
下一篇: P1273 有线电视网 (树上分组背包)
Link_Ray
博客等级 码龄9年 44粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值