SA & SAM】的更多相关文章

上一次做 SA / SAM 相关的题还要数到某场毒瘤 NOIP 模拟赛--这么久没做了都快忘光了--写点东西记录一些最近做到的水好题. LOJ2059 「TJOI / HEOI2016」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\) ,接下来有 \(m\) 次询问.每次询问给出四个参数 \(a,b,c,d\) .求 \(s[a,b]\) 的所有子串和 \(s[c,d]\) 的 LCP 的最大值. \(n,m \le 10^5\) . 题解 题目可以转化为,求一段连续的后缀与 \(…
思路: 1. 二分+后缀数组 2.SAM //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ; ]; ],s[N]; void SA(){ ;i<=n;i++)cntA[s[i]]++; ;i<=;i++)cntA[i]+=cntA[i-]; for(int i=n;i;i--)sa[cntA[s[i]]--]=i; rk…
我写的O(nlogn)O(nlogn)O(nlogn)的SA 8000ms 被 O(n)O(n)O(n)的SAM 2800ms 和 O(n)O(n)O(n)的最小表示法 500ms 头都锤爆- CODE 贴上大常数选手的代码 #include<bits/stdc++.h> using namespace std; char cb[1<<15],*cs=cb,*ct=cb; #define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,…
后缀数组SA \(sa[i]\)与\(rk[i]\) \(sa[i]\) 表示排名为 \(i\) 的后缀是哪一个(在原串中开头位置). \(rk[i]\)(或\(rank[i]\))表示开头位置是 \(i\) 的后缀的排名. 两者是互相映射关系,即 \(sa[rk[i]] = i\). 后缀排序(倍增) 假设我们求出了只考虑长度为\(w\)的每一个后缀的前缀的 \(sa\) 和 \(rk\),怎么求考虑长度为 \(2w\) 的每一个后缀的前缀的\(sa\)和\(rk\) . 对于两个后缀 \(i…
Description: 1<=n<=5e4 题解: 考虑\(f\)这个东西应该是怎样算的? 不妨建出SA,然后按height从大到小启发式合并,显然只有相邻的才可能成为最优答案.这样的只有\(O(n log n)\)个有用的串. 建SAM在fail树上启发式合并是一样的. 然后用个主席树就可以快速查询答案. 现在思考查询一个[x,y],要求f>=z怎么办? 考虑一个区间[l,r],如果a[l-1]<=max[a[l..r]]或a[r+1]<=max[a[l..r]]显然延伸…
SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模板]后缀自动机 (SAM) 题意简述:求一个字符串 \(s\) 的所有子串长度乘上其出现次数的最大值. 代码还没写过,到时候来补一下. update:尝试只看自己的博客写出代码,然而失败了 >.< update:好家伙,第二次跳 \(p\) 的时候(即把 \((p_i,q)\) 变为 \((p_i…
SAM 做题笔记. 这里是 SAM 感性瞎扯. 最近学了后缀自动机(Suffix_Automaton,SAM),深感其巧妙之处,故写文以记之. 部分文字与图片来源于 OI-Wiki,hihoCoder 与一些个人博客,链接在文章最底端. 在此之前请先了解有关于 SAM 的所有函数,并最好理解 OI-Wiki 上有关于 SAM 的五条引理(链接在最底部,引理在下文中有提到). 一些重要的定义与引理: \(T\):初始状态. \(\mathrm{endpos}(i)\):字符串 \(i\) 在 \(…
目录 问题引入 CaiOJ 1461 [EXKMP]最长共同前缀长度 算法讲解 匹配过程 next 的求解 复杂度证明 代码解决 一些例题 UOJ #5. [NOI2014]动物园 CF1051E Vasya and Big Integers 问题引入 众所周知,\(\mathrm{KMP}\) 算法是最为经典的单模板字符串匹配问题的线性解法.那么 \(\mathrm{ExKMP}\) 字面意义是 \(\mathrm{KMP}\) 的扩展,那么它是解决什么问题呢? CaiOJ 1461 [EXK…
题意:给你一个只有abc的字符串,求不相同的子串,(不同构算不同,例如aba和bab算同构) 题解:很显然,如果不考虑同构的问题,我们直接上sa/sam即可,但是这里不行,我们考虑到只有abc三种字符,枚举所有的映射把6个字符串合在一起求不同子串这样每种子串被算了6次,例如ab->(ab,ac,ba,bc,ca,cb)还有单一子串只算了3次例如aa->(aa,bb,cc),那么我们把单一子串乘3加到答案中,再/6即可,考虑到我们需要不能有字符不能是合起来的两端,我们建一个广义sam,每次插入一…
\(SA+SAM\) 第一问显然是一个\(SAM\)的经典问题,我们排完序之后直接使用一直往下找\(n+1-sa[i]-het[i]\)就好了,找到\(K\)减不动了输出就好了 第二问是\(SAM\)的经典问题,我们在\(SAM\)上求出子树和跑一遍\(dfs\)就好了,每层都贪心的减\(K\),减不动就停下来好了 代码 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm…