后缀数组SA-IS模板

大话SALSA算法 本文节选自《这就是搜索引擎:核心技术详解》第六章         SALSA算法的初衷希望能够结合PageRank和HITS算法两者的主要特点,既可以利用HITS算法与查询相关的特点,也可以采纳PageRank的“随机游走模型”,这是SALSA算法提出的背景。由此可见,SALSA算法融合了PageRank和HITS算法的基本思想,从实际效果来说,很多实验数据表明,SALSA的搜索效果也都 阅读详情

.
SAIS真的好快啊,在UOJ能卡进第二页
推荐几个讲的比较好的博客
链接1
链接2
链接3
和一篇讲了各种后缀数组算法的论文
Code:

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
using namespace std;
const int BufferSize = 1180000;
char buffer[BufferSize];
char *out_tail = buffer;
inline void putint(int x)
{
	if (!x) *out_tail++ = '0';
	else
	{
		register char s_pool[6], *s_tail = s_pool;
		while (x != 0) *s_tail++ = x % 10 + '0', x /= 10;
		while (s_tail-- != s_pool) *out_tail++ = *s_tail;
	}
	*out_tail++ = ' ';
}
char S[N]; int n,m;
int s[N<<1],t[N<<1],H[N],sa[N],r[N],p[N],c[N],w[N];
inline int trans(int n,const char* S){
	int m=*max_element(S+1,S+1+n);
	for(int i=1;i<=n;++i) r[S[i]]=1;
	for(int i=1;i<=m;++i) r[i]+=r[i-1];
	for(int i=1;i<=n;++i) s[i]=r[S[i]];
	return r[m];
}
#define ps(x) sa[w[s[x]]--]=x
#define pl(x) sa[w[s[x]]++]=x
inline void radix(int* v,int* s,int* t,int n,int m,int n1){
	memset(sa,0,n+1<<2); memset(c,0,m+1<<2);
	for(int i=1;i<=n;++i) ++c[s[i]];
	for(int i=1;i<=m;++i) w[i]=c[i]+=c[i-1];
	for(int i=n1;i;--i) ps(v[i]);
	for(int i=1;i<=m;++i) w[i]=c[i-1]+1;
	for(int i=1;i<=n;++i) if(sa[i]>1 && t[sa[i]-1]) pl(sa[i]-1);
	for(int i=1;i<=m;++i) w[i]=c[i];
	for(int i=n;i;--i) if(sa[i]>1 && !t[sa[i]-1]) ps(sa[i]-1);
}
inline void SAIS(int n,int m,int* s,int* t,int* p){
	int n1=0,ch=r[1]=0,*s1=s+n; t[n]=0;
	for(int i=n-1;i;--i) t[i]=s[i]==s[i+1]?t[i+1]:s[i]>s[i+1];
	for(int i=2;i<=n;++i) r[i]=t[i-1]&&!t[i]?(p[++n1]=i,n1):0;
	radix(p,s,t,n,m,n1);
	for(int i=1,x,y;i<=n;++i) if(x=r[sa[i]]){
		if(ch<=1 || p[x+1]-p[x]!=p[y+1]-p[y]) ++ch;
		else for(int j=p[x],k=p[y];j<=p[x+1];++j,++k)
			if((s[j]<<1|t[j])^(s[k]<<1|t[k])){ ++ch; break; }
		s1[y=x]=ch;
	}
	if(ch<n1) SAIS(n1,ch,s1,t+n,p+n1);
	else for(int i=1;i<=n1;++i) sa[s1[i]]=i;
	for(int i=1;i<=n1;++i) s1[i]=p[sa[i]];
	radix(s1,s,t,n,m,n1);
}
inline void SA(int n,const char* S){
	int m=trans(++n,S);	SAIS(n,m,s,t,p);
	for(int i=1;i<n;++i) r[sa[i]=sa[i+1]]=i;
	for(int i=1,j,k=0;i<n;++i) if(r[i]>1){
		for(j=sa[r[i]-1];S[i+k]==S[j+k];++k);
		if(H[r[i]]=k) --k;
	}
}
int main(){
	gets(S+1); n=strlen(S+1); SA(n,S);
	for (int i = 1; i <= n; ++i) putint(sa[i]);
	*out_tail++ = '\n';
	for (int i = 2; i <= n; ++i)  putint(H[i]);
	fwrite(buffer, 1, out_tail - buffer, stdout);
}
后缀数组的构造sa,rank和height数组 智商余额又不足了, 看着后缀树的代码看了一整天还是一知半解,看来暂时只能套模板了。  后缀数组sa[] 保存了一个字符串的所有后缀, 并且按字典序排序。 sa[i] =k 的意思就是 排在第2i个的后缀, 在原串里是以k开头的后缀。  rank[]数组是sa数组的逆运算, rank[k]=i的意思是从位置k开始的后缀在后缀数组中排第i位。 height数组保存了 后缀数组中相邻两个后缀的最大 阅读详情

相关推荐

后缀数组:解决多字符串LCS问题的关键技术工具

后缀数组是一种数据结构,它以数组的形式存储字符串的所有后缀,并且按字典序进行排序。在计算机科学领域,特别是字符串处理和文本搜索中,后缀数组是一种极为重要的工具。与前缀树(Trie)不同,后缀数组不需要额外的数据结构支持,因此在某些应用中更为节省空间。后缀数组的核心优势在于它能够高效地解决多种字符串处理问题,比如最长公共前缀问题、最长重复子串问题等。其工作原理依赖于将字符串的所有后缀进行排序,并将排序结果存入一个数组中,这个数组就是后缀数组。

weixin_29885875的博客 896

后缀数组的SA-IS构造方法

SA-IS算法  之前的后缀数组都是用的倍增法来构造的,但是之前一场多校倍增的写法T了,就到网上学习了SA-IS算法,在此记录一下。  SA-IS算法的时间复杂度为O(n)O(n)O(n),运行效率比DC3算法和倍增法都要高,常数较小且实现简单。  SA-IS 算法是基于诱导排序这种思想。基本想法就是将问题的规模缩小,通过解决更小的问题,获取足够信息,就可以快速的解决原始问题。从这里也可以看出,这一过程需要递归处理子问题。  该算法的基本框架如下: 1.将所有的后缀分为为S型后缀和L型后缀(将在后面介绍这两

AlieZ的博客 2206

Windows升级保留个人文件和应用灰色?改注册表版本指纹

Windows 升级安装并非简单跳过下一步,安装程序会先读取注册表中 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的 EditionID、ProductName、CompositionEditionID 等版本指纹,与目标镜像 install.wim/esd 记录的版本类型做双向匹配。若当前系统被识别为 LTSC、精简版或跨版本降级,兼容性扫描会判定升级路径不可用,于是“保留个人文件和应用”变灰,只能全新安装。理解版本指纹与升级可行性表的匹配机制,可

weixin_31986143的博客 363

字符串算法总结(一)

前言: 字符串是最自然的一种信息的表达方式,所以这方面的题目也会有许多。可以分为两个方面,一方面是求匹配长度,最长子串,回文串之类的,另一方面是字符串dp。本文对前者做一些总结。

Demon_Rieman的博客 1008

SAP IDOC实战:如何用EDI实现跨公司采购订单自动生成销售订单(附完整配置步骤)

本文详细解析了如何利用SAP IDOC与EDI技术,实现跨公司采购订单自动生成销售订单的完整流程。通过实战案例,从业务蓝图设计、输出条件配置、伙伴参数设定到IDOC消息类型处理,提供了清晰的配置步骤与故障排查指南,帮助企业打通内部业务流,构建高效的自动化闭环。

weixin_29215815的博客 727

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

让AI语音更自然:Parler-TTS Mini提示词工程技巧清单与高质量生成实战

**Parler-TTS Mini v0.1** 是一个完全开源的轻量级文本转语音(TTS)模型,经过 10.5K 小时高质量音频训练,只需一句自然语言描述,就能"指挥"出指定性别、音高、语速、背景声和混响效果的声音。本文整理了一套 TTS 提示词工程技巧清单与可直接套用的场景模板,帮你快速生成接近真人水准的 AI 语音。 ## 🎙️ 为什么 Parler-TTS Mini 适合做自然语音生成

gitblog_01099的博客 985

飞书应用开发脚手架lark-harness:从零构建企业级机器人

在构建企业级应用时,开发脚手架是提升工程效率和规范性的关键工具。其核心原理在于通过预设的项目模板、最佳实践和通用模块封装,自动化处理项目初始化、配置管理和基础架构搭建。这种技术价值在于将开发者从重复性劳动中解放出来,确保团队技术栈统一,并降低维护成本。在Node.js生态中,脚手架常与Express或Koa等Web框架结合,用于快速构建Web服务、API接口和实时事件处理系统。具体到飞书开放平台开发场景,开发者需要处理OAuth 2.0授权、事件订阅验证、消息加解密等复杂且标准的流程。lark-harnes

weixin_30703911的博客 612

URAL 1713 Key Substrings 后缀数组

URAL 1713 Key Substrings 后缀数组 这一类题目,首先模板抄对,熟悉通常问题的解法,把论文里的题目弄懂,一般的题目就可解了 多字符串题目,都是连成一个串再处理 最好写个debuge_sa() 检验模板: 比如: void debuge_sa() { for (int i = 0; i <= n; i++) cout << i << ' ' << r

冰 1170

SAR合成孔径雷达成像及处理(附带Matlab源代码)

总结:本文介绍了SAR合成孔径雷达的基本原理,并提供了使用Matlab实现SAR成像和处理的源代码示例。然后,在慢时间域进行方位压缩处理,通过计算每个接收通道的延迟和频移,将多次接收的信号叠加得到最终的成像结果。SAR成像的基本原理是通过接收雷达发射的脉冲信号的回波,并利用多次接收的信号进行叠加处理。以多普勒频移校正为例,根据雷达飞行速度和方位角,计算实际的多普勒频率,并对每个接收通道的数据进行频移校正,以消除因目标运动引起的频率偏移。通过调整参数和算法,可以实现不同的SAR成像和处理效果。

ByteJolt的博客 688

100天精通Python(可视化篇)——第89天:Bokeh库绘图可视化基础入门(参数说明+案例实战)

专栏导读 一、Bokeh是什么? 二、安装与导入 三、Bokeh接口介绍 四、创建图表 五、添加自定义渲染器 切换主题 添加图例 图例位置 图例方向 图例背景和边界 图例文本的外观 行列布局 网格布局

努力让自己发光,对的人才能迎着光而来 1万+

字符串-后缀数组

倍增法,每次排2^j长度的段,转移就是双关键字排序就好啦! 求height可以利用height[rank[i]]>=height[rank[i-1]]-1的性质,当然证明考虑构造,并反证,假设在其中插入元素使性质不成立,推矛盾就可以了。 基本上是从网上抄来的模板啦,解释一下代码吧~ x在交换之前充当了rank的功能。 关于c的用处,来看计数排序的实现方法: for(i=1;i&...

weixin_30700099的博客 179

【Bug已解决】zsh: command not found: claude 解决方案

方案适用场景推荐指数难度方案一:配置 npm 全局目录所有平台,长期使用⭐⭐⭐⭐⭐低方案二:修复 PATH 变量快速修复,不想改 npm 配置⭐⭐⭐⭐低方案三:重建软链接文件存在但链接断裂⭐⭐⭐中方案四:nvm 专属方案使用 nvm 管理多版本 Node.js⭐⭐⭐⭐低方案五:Windows 专属Windows 系统⭐⭐⭐⭐⭐低方案六:Homebrew 安装macOS 用户,npm 有问题⭐⭐⭐低根本原因。

博客 1万+

超级简单的后缀数组(SA)!!

省流:最详细的博客!一步一步带你分析国集选手的代码!!

WerChange的OI博客 1324

uniapp APP端:蓝牙报错writeBLECharacteristicValue:fail property not support(uni.writeBLECharacteristicVal)

uni-app 蓝牙fail property not support、发现不了服务特征值的问题、突然发现微信蓝牙小秘密,使用uni-app编译成安卓APP后报错writeBLECharacteristicValue:fail property not support,发现不了服务特征值,uniApp APP调用蓝牙API发送指令过快导致,uniapp 蓝牙 writeBLECharacteristicValue property_not_support iOS Android BLE GATT 特征值写入

✅ 精选推荐文章 2943

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【模板】后缀数组SA

参考题目:UOJ35 解析: 这次贴的代码有点多,除了最裸的暴力,基本上能够想到的其他各种复杂度能够过和不能过的我都去写了一遍。 但是解析可能要不知道什么时候更了。。。 之后会把后缀数组所有用途和性质都更新过来的。 代码: 哈希二分+快速排序(复杂度O(nlog⁡2n)O(n\log^2n)O(nlog2n)): #include&lt...

anlongyi8087的博客 329

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SA后缀数组

子串:在一个字符串s中,取任意i

Se_ren_di_pity的博客 687

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【详细注释 | 字符串算法集合 2】后缀自动机 SAM & 后缀数组 SA

难,但我讲的很好。

Isaac Regulus的博客 1176

后缀数组 SA

后缀数组 SA 后缀树组(SA,suffix array),用于处理字符串子串形成的结构。 处理子串的结构主要方式有:后缀数组 SA,后缀自动机 SAM,后缀树 ST。 后缀树和后缀自动机暂时决定咕咕咕,以后学习可以参考ix35 的字符串复习。 含义与实现 后缀 我们定义长度为 \(n\) 的字符串 \(s\) 编号为 \(l\) 的后缀为 \(s\) 在 \([l,s]\) 上的字串,记 \(...

EricQian的博客 681

后缀数组模板

详细理解后缀数组求sa数组的函数,该函数可以看为主要分为三个部分,第一个部分是预处理;第二个部分是进行基数排序,首先根据第二关键词排序,然后根据第一关键字排序;第三个部分是根据排序后的结果重新为每个字符串分配桶。后两个部分以倍增的形式重复,直到排序结束。

qq_53237241的博客 1212

模板:后缀数组(SA)

强大的算法

BUG_Creater_jie的博客 789

浅谈后缀数组 + 模板

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

FSYo 的博客 1020

后缀数组(SA)总结

后缀数组(SA)总结 这个东西鸽了好久了,今天补一下 概念 后缀数组\(SA\)是什么东西? 它是记录一个字符串每个后缀的字典序的数组 \(sa[i]\):表示排名为\(i\)的后缀是哪一个。 \(rnk[i]\):可以理解为\(SA\)数组的逆,记录后缀\(i\)的排名是多少,\(rnk[SA[i]]=i\)。 \(lcp[i]\):别人一般叫\(height\),表示后缀\(SA[i...

372

后缀数组SA

后缀数组SA 模板 花了不少时间才理解倍增求SASASA的实现方法,我还是太菜了。 定义sa[i]sa[i]sa[i]表示排名为iii的后缀的起始位置。 定义rank[i]rank[i]rank[i]表示起始位置为iii的后缀的排名。 显然两者之前互逆。 void solve() { int m=122; for (int i=1;i<=m;i++) cnt[i]=0; for (in...

xmr_pursue_dreams的博客 203
上一篇: 自适应simpson积分模板
下一篇: 字符串专题1
扩展的灰
博客等级 码龄12年 60粉丝 342原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值