后缀数组SA】的更多相关文章

后缀数组(SA)总结 这个东西鸽了好久了,今天补一下 概念 后缀数组\(SA\)是什么东西? 它是记录一个字符串每个后缀的字典序的数组 \(sa[i]\):表示排名为\(i\)的后缀是哪一个. \(rnk[i]\):可以理解为\(SA\)数组的逆,记录后缀\(i\)的排名是多少,\(rnk[SA[i]]=i\). \(lcp[i]\):别人一般叫\(height\),表示后缀\(SA[i]\)与\(SA[i-1]\)的最长公共前缀的长度. 后缀排序 求出后缀数组的算法,模板题 代码 先上代码,便…
什么是后缀数组 后缀数组\(sa[i]\)表示字符串中字典序排名为\(i\)的后缀位置 \(rk[i]\)表示字符串中第\(i\)个后缀的字典序排名 举个例子: ababa a b a b a rk:3 5 2 4 1 sa: 5(a) 3(aba) 1(ababa) 4(ba) 2(baba) 那么就有\(sa[rk[i]]=rk[sa[i]]=i\) 后缀数组的求法 二周目 倍增法 看一会儿还是比较好记的 但没有理解每句话是在干什么的话以后再写就会没有思路 因此这里简述一下基本过程和一些关键…
参考资料:victorique的博客(有一点锅无伤大雅,记得看评论区),$wzz$ 课件(快去$ftp$%%%),$oi-wiki$以及某个人的帮助(万分感谢!) 首先还是要说一句:我不知道为什么我这么菜让我讲这么大神的知识点,我理解不深刻,你们可以随时$Ha(n)ck$然后我可能就fix不了了你知道吧 (好吧我大概又理解了因为数学是NC讲的数据结构是skyh讲的我能讲的可能也就是这种东西了) 希望还会的大神帮我解场...(某$bx$和某牛都$A$穿了) 顺便「无图预警」(懒得画又懒得粘) 当时…
bzoj3796Mushroom追妹纸 题目描述 Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他从网上找到了两篇极佳的情书,打算选择其中共同的部分.另外,Mushroom还有个一个情敌Ertanis,此人也写了封情书给妹子. Mushroom不希望自己的情书中完整的出现了情敌的情书.(这样抄袭的事情就暴露了). Mushroom把两封情书分别用字符串s1和s2来表示,Ertanis的情书用字符串…
参考资料这次是真抄的: 1.后缀数组详解 2.后缀数组-学习笔记 3.后缀数组--处理字符串的有力工具 定义 \(SA\)排名为\(i\)的后缀的位置 \(rk\)位置为\(i\)的后缀的排名 \(tp\)第二关键字的排名为\(i\)的后缀的位置,还被用作\(rank\)的暂存 \(tax\)每个排名对应的后缀数量 后缀数组就是为了求出\(sa\)和\(rk\) 性质 \(rk[sa[i]]=i\) \(sa[rk[i]]=i\) $LCP(x,y) $:字符串x与字符串y的最长公共前缀,在这里…
后缀数组 概念 实际上就是将一个字符串的所有后缀按照字典序排序 得到了两个数组 \(sa[i]\) 和 \(rk[i]\),其中 \(sa[i]\) 表示排名为 i 的后缀,\(rk[i]\) 表示后缀 i 的排名 注意到 \(rk\) 和 \(sa\) 是互逆的,即 \(sa[rk[i]]=rk[sa[i]]=i\) 先讨论几个关于 \(lcp\) 的性质,令 \(lcp(i,j)\) 表示 \(sa[i]\) 和 \(sa[j]\) 的最长公共前缀 \(lcp(l,r)=min(lcp(l,…
这篇博客不打算讲多么详细,网上关于后缀数组的blog比我讲的好多了,这一篇博客我是为自己加深印象写的. 给你们分享了那么多,容我自私一回吧~ 参考资料:这位dalao的blog 一.关于求SuffixArray的一些变量定义: 1. sa[i]=j,表示第i名的后缀从j开始 **存的是下标** 2. rnk[i]=j,从i开始的后缀是第j名的 **与sa为互逆运算,存的是值** 3. tp[i]=j, 第二关键字为i的后缀从j开始 **可理解为第二关键字的SA,存的是下标** 插入解释一下第一关…
复杂度:O(nlogn) 注:从0到n-1 const int maxn=1e5; char s[maxn]; int sa[maxn],Rank[maxn],height[maxn],rmq[maxn][50]; void build() { //sa[] int n=strlen(s),m=128; static int x[maxn],y[maxn],c[maxn]; for(int i=0;i<m;++i)c[i]=0; for(int i=0;i<n;++i)c[x[i]=s[i]]…
真是一个三倍经验好题啊. 我们来观察这个题目,首先如果直接整体计算,怕是不太好计算. 首先,我们可以将每个子串都看成一个后缀的的前缀.那我们就可以考虑一个一个后缀来计算了. 为了方便起见,我们选择按照字典序来一次插入每个后缀,然后每次考虑当前后缀会产生的新串和与之前插入的串重复的串(这里之所以可以这么考虑,是因为如果他会对后面的串产生重复的话,那么会在后面那个串加入的时候计算的) 那么我们考虑,一个排名为\(i\)的后缀,插入之后不考虑重复的话,会新增多少个子串呢? 不难发现是\(n-sa[i]…
补博客! 首先我们观察题目中给的那个求\(ans\)的方法,其实前两项没什么用处,直接\(for\)一遍就求得了 for (int i=1;i<=n;i++) ans=ans+i*(n-1); 那么我们考虑剩下的部分应该怎么求解! 首先这里有一个性质.对于任意两个后缀\(i,j\),他们的\(lcp\)长度是他们对应的\(rank\)之间的\(height\)的\(min\) (左开右闭) 或者这样说 \(lcp(i,j) = min(height[rank[i]+1],height[rank[…
题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可以很简单的得出,差分后的串相同即相同. [思路] 首先肯定是要对N个串分别进行差分,然后将N个串合并成一个串,首尾相接即可,但要标记那些数属于哪一个Mi(后边要进行check),这里呢要注意,记得将串分隔开来, 不然会WA,这里我用的分隔方法是在串之间加0,合并完成后,题目就可变成求最长的不重叠的重…
题意:给n个数字串,求它们的所有不包含前导0的不同子串的值之和 思路:把数字串拼接在一起,构造SAM,然后以每个状态的长度len作为特征值从小到大排序,从前往后处理每个状态,相当于按拓扑序在图上合并计算答案. #include <bits/stdc++.h> using namespace std; #define X first #define Y second #define pb(x) push_back(x) #define mp(x, y) make_pair(x, y) #defi…
写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, 能够实现后缀树的很多功能而时间复杂度也不太逊色,并且,它比后缀树所占用的空间小很多. 可以说,在信息学竞赛中后缀数组比后缀树要更为实用! 因此在本文中笔者想介绍一下后缀数组的基本概念.构造方法, 以及配合后缀数组的最长公共前缀数组的构造方法,最后结合一些例子谈谈后缀数组的应用. 一.What  Is…
一些定义:设字符串S的长度为n,S[0~n-1]. 子串:设0<=i<=j<=n-1,那么由S的第i到第j个字符组成的串为它的子串S[i,j]. 后缀:设0<=i<=n-1,那么子串S[i,n-1]称作它的后缀,用Suffix[i]表示. 串比较:对于两个串S1,S2,设长度分别为n1,n2.若存在一个位置i,使得对于0<=j<i满足S1[j]=S2[j]且S1[i]<S2[i],那么我们称S1<S2.如果S1是S2的一个前缀,那么也有S1<S2…
题目描述: 找出一个字符串中至少重复出现两次的字串的个数(重复出现时不能重叠). code: 后缀数组处理,对于得到height 进行查找...  参考http://blog.csdn.net/mishifangxiangdefeng/article/details/7109211博主的详细的代码思路 #include<iostream> #include<string> using namespace std; #define N 1200 string s; *N], rank…
hdu题目 poj题目 参考了 罗穗骞的论文<后缀数组——处理字符串的有力工具> 题意:求两个序列的最长公共子串 思路:后缀数组经典题目之一(模版题) //后缀数组sa:将s的n个后缀从小到大排序后将 排序后的后缀的开头位置 顺次放入sa中,则sa[i]储存的是排第i大的后缀的开头位置.简单的记忆就是“排第几的是谁”. //名次数组rank:rank[i]保存的是suffix(i){后缀}在所有后缀中从小到大排列的名次.则 若 sa[i]=j,则 rank[j]=i.简单的记忆就是“你排第几”…
在字符串处理当中,后缀树和后缀数组都是非常有力的工具,其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料.其实后缀是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也不太逊色,并且,它比后缀树所占用的空间小很多.可以说,在信息学竞赛中后缀数组比后缀树要更为实用.因此在本文中笔者想介绍一下后缀数组的基本概念.构造方法,以及配合后缀数组的最长公共前缀数组的构造方法,最后结合一些例子谈谈后缀数组的应用. 基本定义:子串 字符串 S 的子串 r[i..…
思路:这题下午搞了然后一直WA,后面就看了Discuss,里面有个数组:ABCDEFDCBA,这个我输出ABCD,所以错了. 然后才知道自己写的后缀数组对这个回文子串有bug,然后就不知道怎么改了. 然后看题解,里面都是用RMQ先预处理随意两个后缀的最长公共前缀,由于不太知道这个,所以又看了一下午,嘛嘛-- 然后理解RMQ和后缀一起用的时候才发现事实上这里不用RMQ也能够,仅仅要特殊处理一下上面这个没过的样例即可了,哈哈--机智-- 解法一: 这个是不用RMQ做的: #include<iostr…
思考:其实很easy.就在两个串在一起.通过一个特殊字符,中间分隔,然后找到后缀数组的最长的公共前缀.然后在两个不同的串,最长是最长的公共子串. 注意的是:用第一个字符串来推断是不是在同一个字符中,刚開始用了第二个字符的长度来推断WA了2发才发现. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<…
以后似乎终于不用去学后缀数组的倍增搞法||DC3等blablaSXBK的方法了= = 定义(来自关于后缀数组的那篇国家集训队论文..) 后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列SA[1],SA[2],……,SA[n],并且保证Suffix(SA[i])<Suffix(SA[i+1]),1≤i<n. 也就是将S的n个后缀从小到大进行排序之后把排好序的后缀的开头位置顺次放入SA中. height数组:定义height[i]=suffix(sa[i-1])和suffix(sa[…
稍微学习了下第一次用后缀数组- - , 强行凑出答案 , 感觉现在最大的问题是很多算法都不知道 ,导致有的题一点头绪都没有(就像本题).  /*推荐 <后缀数组——处理字符串的有力工具>——罗穗骞 后缀数组sa,  sa[ i ] = a表示字符串从第a个开始到结尾的字典序排序为i 本题是绕成了一个环,所以我将字符串重复一遍再用后缀数组模板跑一次. 顺序的话,取最后一个即可 反序的话,因为相同情况下,要求取得尽可能小. hight求的是i和i-1的最长公共前缀,如果串i-1整个是公共最长前缀,…
题目链接:https://www.luogu.org/problemnew/show/P4051 思路:我们联想求后缀数组sa的过程,发现我们在求y数组的时候(第二关键字,下标为第二关键字的排位,值为合并之后关键字的位置),对于那些没有第二关键字的部分,我们都是直接补0,让这部分的第二关键字排在最前面,但是因为这道题是一个环,所以不存在没有第二关键字的情况,所以我们只需要在板子上面改点东西(求第二关键字的部分改一下),用取模来把范围控制在1到n之间就可以了. 这里因为可能有空格,所以我用gets…
描述 后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者DC3算法实现,这超出了我们的讨论范围.在本题中,我们希望使用快排.Hash与二分实现一个简单的 O(n log^2⁡n ) 的后缀数组求法.详细地说,给定一个长度为 n 的字符串S(下标 0~n-1),我们可以用整数 k(0≤k<n) 表示字符串S的后缀 S(k~n-1).把字符串S的所有后缀按照字典序排列,排名为 i 的后缀记为 SA[i].额外地,我们考虑排名为 i 的后缀与排名为 i-1 的后缀,把二者的最长公共前缀的长度记…
题目链接:传送门 描述 后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者DC3算法实现,这超出了我们的讨论范围. 在本题中,我们希望使用快排.Hash与二分实现一个简单的 $O(n \log^2 ⁡n )$ 的后缀数组求法. 详细地说,给定一个长度为 n 的字符串S(下标 0~n-1),我们可以用整数 k(0≤k<n) 表示字符串S的后缀 S(k~n-1). 把字符串S的所有后缀按照字典序排列,排名为 i 的后缀记为 SA[i].额外地,我们考虑排名为 i 的后缀与排名为 i-1 的后…
倍增算法 基本定义子串:字符串 S 的子串 r[i..j],i≤j,表示 r 串中从 i 到 j 这一段也就是顺次排列 r[i],r[i+1],...,r[j]形成的字符串. 后缀:后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串. 字串 r 的 从 第 i 个 字 符 开 始 的 后 缀 表 示 为 Suffix(i) , 也 就 是Suffix(i)=r[i..len(r)]. 后缀数组:后缀数组 SA 是一个一维数组,它保存 1..n 的某个排列 SA[1],SA[2],……,S…
题目 http://poj.org/problem?id=3080 题意 有m个(2<=m<=10)不包含空格的字符串,长度为60个字符,求所有字符串中都出现过的最长公共子序列,若该子序列长度小于3,输出"no significant commonalities",否则,输出字典序最小且长度最大的公共子序列. 思路 由于数据较小,其实可以使用比较暴力的思路,但这里为了复习后缀数组采用后缀数组的方法. 1. 将多个字符串合为一个目标字符串buff,为了防止程序无法分清字符串连…
1402 后缀数组 0x10「基本数据结构」例题 描述 后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者DC3算法实现,这超出了我们的讨论范围.在本题中,我们希望使用快排.Hash与二分实现一个简单的 O(n log^2⁡n ) 的后缀数组求法.详细地说,给定一个长度为 n 的字符串S(下标 0~n-1),我们可以用整数 k(0≤k<n) 表示字符串S的后缀 S(k~n-1).把字符串S的所有后缀按照字典序排列,排名为 i 的后缀记为 SA[i].额外地,我们考虑排名为 i 的后缀与排…
//后缀数组模板,MANX为数组的大小 //支持的操作有计算后缀数组(sa数组), 计算相邻两元素的最长公共前缀(height数组),使用get_height(); //计算两个后缀a, 和b的最长公共前缀,请先使用lcp_init(),再调用get_lcp(a, b)得到 //下面的n是输入字符串的长度+1(n = strlen(s) + 1), m是模板的范围 m=128表示在字母,数字范围内,可以扩大也可缩小 //s[len] 是插入的一个比输入字符都要小的字符 struct SufArr…
转自:http://blog.csdn.net/yxuanwkeith/article/details/50636898 五分钟搞懂后缀数组!后缀数组解析以及应用(附详解代码) 作者:YxuanwKeith 为什么学后缀数组 后缀数组是一个比较强大的处理字符串的算法,是有关字符串的基础算法,所以必须掌握. 学会后缀自动机(SAM)就不用学后缀数组(SA)了?不,虽然SAM看起来更为强大和全面,但是有些SAM解决不了的问题能被SA解决,只掌握SAM是远远不够的. …… 有什么SAM做不了的例子? …
Beside other services, ACM helps companies to clearly state their “corporate identity”, which includes company logo but also other signs, like trademarks. One of such companies is Internet Building Masters (IBM), which has recently asked ACM for a he…