SAM & 广义 SAM & SA 学习笔记】的更多相关文章

题意 链接 Sol \(10^5\)次询问每次询问\(10^5\)个区间..这种题第一感觉就是根号/数据分治的模型. \(K\)是个定值这个很关键. 考虑\(K\)比较小的情况,可以直接暴力建SAM,\(n^2\)枚举\(w\)的子串算出现次数.询问用个\(n^2\)的vector记录一下每次在vector里二分就好. \(K\)比较大的情况我没想到什么好的做法,网上的做法复杂度也不是很好.. 然后写了个广义SAM + 暴力跳parent就过了.. 不过这题思想还是很好的 #include<bi…
什么是后缀数组 后缀数组\(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\) 后缀数组的求法 二周目 倍增法 看一会儿还是比较好记的 但没有理解每句话是在干什么的话以后再写就会没有思路 因此这里简述一下基本过程和一些关键…
后缀数组是解决字符串问题的有力工具--罗穗骞 后缀数组是对字符串的后缀排序的一个工具, sa将排名为i的字符串的开头位置记录下来, rnk将开头位置为i的字符串的排名记录下来. https://www.cnblogs.com/ECJTUACM-873284962/p/6618870.html 如代码(刚刚写到一半机房电脑蓝屏了,心态爆炸,先放的) #include <iostream> #include <cstring> #include <cctype> #incl…
SAM学习笔记 后缀自动机(模板)NSUBSTR(Caioj1471 || SPOJ 8222) [题意] 给出一个字符串S(S<=250000),令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Lengh(S)); [输入格式] 一个字符串 [输出格式] 依次输出答案 [样例输入] ababa [样例输出] 3 2 2 1 1 [算法分析] 相信大家在学习这个专题时已经接触过很多有关解决字符串问题的其它算法了.但是我们接下来要学的这个专题对于解决字符串的一系列难题都…
最近学了SAM已经SAM的比较简单的应用,SAM确实不好理解呀,记录一下. 这里提一下后缀自动机比较重要的性质: 1,SAM的点数和边数都是O(n)级别的,但是空间开两倍. 2,SAM每个结点代表一个endpos,每个endpos有可能代表多个字串(当然这些字串的endpos相等),且这些字串的长度呈一个梯形. 3,令tree[x].len为点x代表的所有字串中长度最长的,tree[x].short为最短的,那么tree[x].short=(tree[fa].len)+1,根据这条性质其实tre…
题目链接 \(Click\) \(Here\) 设一个串\(s\)在\(A\)中出现\(cnt[s][1]\)次,在\(B\)中出现\(cnt[s][2]\)次,我们要求的就是: \[\sum cnt[s][1]*cnt[s][2]\] 在\(SAM\)这种把多个串用一个点表示的东西里,答案就变成了这个 \[\sum cnt[s][1] * cnt[s][2] * (len[fa[s]]-len[s])\] 其中的\(cnt\)求法,听说好像可以两个串隔开求?但是我不太会.学了一下用广义\(SA…
3473: 字符串 Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一行n个整数,第i个整数表示第i个字符串的答案. Sample Input 3 1 abc a ab Sample Output 6 1 3 HINT 对于 100% 的数据,1<=n,k<=10^5,所有字符串总长不超过10^5,字符串只包含小写字母. [分析] 这道题用后缀数…
\(n\leq 100000\) 题目上求出 多少条本质不同的路线. 首先定义了 相似的城市为度数相同的城市. 还定义了两条路线相同当且仅当长度相同 且对应位置的城市都是相似的. 考虑这张图的形态 n-1条边 且每个点都能到1号点. 不可能出现环 因为 考虑如果出现环必然 x个点 x条边 根据鸽巢原理 一个点被孤立了 所以这是一棵内向树. 暴力显然是把所有长度相同的路线给拿出来然后去重比对. 如何去重 我们考虑把度数相同的点就定义为其度数大小 然后很容易利用hash或者暴力进行比对. 进一步的…
正题 题目链接:https://www.luogu.com.cn/problem/CF204E 题目大意 \(n\)个字符串的一个字符串集合,对于每个字符串求有多少个子串是这个字符串集合中至少\(k\)个字符串的子串. 解题思路 因为对于每个字符串我们需要维护的信息不同,不能累加,所以考虑使用线段树合并. 先将\(n\)个字符串构建出一个广义\(SAM\),然后对于每个节点维护一个该线段树表示该节点属于的字符串.然后在\(parents\)树上从下往上合并,如果属于字符串的数量多余\(k\),那…
正题 题目链接:https://www.luogu.com.cn/problem/P6793 题目大意 给出两个长度为\(n\)的字符串,取出他们所有长度为\(k\)的连续子串分别构成两个可重集合\(A,B\). 你每次可以花费\(x\)点代价修改\(A\)中一个字符串长度为\(x\)的后缀,求至少花费多少代价能够使得两个集合完全相同. \(1\leq k\leq n\leq 1.5\times 10^5\) 解题思路 两个串\(S,T\)的匹配代价是\(max\{k-LCP(S,T),0\}\…