
后缀数组SA
zxyoi_dreamer
退役了退役了爬了爬了,搞个锤子算法竞赛,不如好好享受大学生活。
展开
-
【CF917E】Upside Down(哈希二分)(后缀数组)(AC自动机)
传送门诈尸,主要是最近一直在刷水题感觉没有什么值得写的。口胡好题,不建议写。题解:一句话说,将出现的情况分为在 u-LCA链上 和横跨LCA 分别统计。在链上的可以直接建立正反AC自动机,然后树上DFS的同时AC自动机中DFS序+差分算一下出现次数即可。考虑横跨LCA的情况,找出 u->LCA 的后缀能匹配的最长前缀和 LCA->v 的前缀能匹配的最长后缀。那么所有能匹配的前缀和后缀都是最长匹配前缀和后缀的border,分为log个等差数列,算一下凑成原串的方案数即可。然后讲一下原创 2020-05-20 21:45:43 · 944 阅读 · 0 评论 -
【校内模拟】幻想(后缀平衡树)
简要题意:给你一个字符串 SSS,请你支持:末尾加字符末尾删字符给一个询问串 QQQ ,求 QQQ 在 S[l:r]S[l:r]S[l:r] 中出现了多少次。强制在线题解:如果第三个操作没有 l,rl,rl,r 的限制就是 BZOJ4768,后缀平衡树裸题。有的话也没什么区别,开个vector维护一下子树内的点有哪些就行了。复杂度好像是两个 log,但是跑得飞起。一个lo...原创 2020-04-09 17:24:37 · 324 阅读 · 2 评论 -
【X Round -1 】树上后缀排序(后缀平衡树)
传送门没有题解:后缀平衡树裸题。由于出题人语文不行,请去讨论区查看正确题意。下面这份代码就是在错的题意下写了之后改的,所以排序部分非常诡异。代码:#include<bits/stdc++.h>#define ll long long#define re register#define cs constusing std::cerr;using std::co...原创 2019-11-22 10:31:24 · 203 阅读 · 0 评论 -
【BZOJ5084】hashit(后缀平衡树)(哈希)
传送门题解:如果我们能够搞出后缀数组,显然我们考虑维护一下ht数组就行了。直接上后缀平衡树,每次找到前驱后继,然后直接算LCP即可。代码:#include<bits/stdc++.h>#define ll long long#define re register#define cs constusing std::cerr;using std::cout;...原创 2019-10-10 09:47:58 · 290 阅读 · 0 评论 -
【BZOJ4768】wxh loves substring(后缀平衡树)
传送门题解:由于需要支持删除,所以SAM+LCT的做法不行了。但是后缀平衡树就没有这个问题,注意删除和重构写得不好可能会炸精度。没有删除的版本见:here代码:#include<bits/stdc++.h>#define ll long long#define re register#define cs constnamespace IO{ inline c...原创 2019-10-06 15:04:19 · 304 阅读 · 0 评论 -
【BZOJ2555】SubString(后缀平衡树)
传送门题解:后缀平衡树练手题。设询问串为qqq,qqq#为在qqq后面接了一个极大字符的串,如果我们能够求得后缀数组,显然排名在qqq和qqq#之间的就是qqq能够匹配的位置。由于强制在线,维护后缀数组用后缀平衡树即可。代码:#include<bits/stdc++.h>#define ll long long#define re register#define ...原创 2019-10-06 15:00:44 · 259 阅读 · 0 评论 -
【BZOJ3682】Phorni(后缀平衡树)(ZKW线段树)
传送门题解:后缀平衡树板子,维护直接用ZKW线段树即可。大概讲一下后缀平衡树的思想和构造方式:主要想法是维护所有后缀的相对大小顺序,利用平衡树上维护range的一点trick可以做到O(1)O(1)O(1)比较两个后缀的相对大小顺序。那么这样可以支持在线前端插入一个字符,考虑如何快速找到这个后缀应该插到哪里,也就是我们需要支持比较这个后缀和之前任意一个后缀的大小关系。比较当前字符,相...原创 2019-10-05 18:13:16 · 281 阅读 · 0 评论 -
【TJOI2017】DNA(后缀数组)
传送门我去看了一下其他的题解,目前找得到的SAM上dfs和DP的做法全部复杂度都是假的。没什么价值。哈希的做法复杂度带一个log,因为不满,而且出题人没有卡自然溢出,所以常数比后缀数组的做法小,十分优秀。后缀数组的做法:将两个串拼接在一起构造后缀数组,于是我们现在可以支持O(1)O(1)O(1)查询LCP,由于允许失配三次,我们利用LCP直接跳过相同的极长段即可。可能SA-IS的后缀数组...原创 2019-09-24 12:10:26 · 203 阅读 · 0 评论 -
【BZOJ4310】跳蚤(后缀数组)(二分答案)
传送门题解:二分答案为第KKK小的子串(要求本质不同,这个可以后缀数组预处理后快速查询),转化为要求切割后不能存在字典序大于第KKK小的子串。从后往前贪心切割即可。代码:#include<bits/stdc++.h>#define ll long long#define re register#define cs constusing std::cerr;us...原创 2019-09-24 11:20:32 · 258 阅读 · 0 评论 -
【洛谷P5115】Check,Check,Check one two!(后缀数组)(并查集)
传送门题解:前前后后花了几个月的时间总算是把shadowice的比赛写到只剩一道题了,那道题是个很水的莫队不想写了。然而这道题标算给了个很扯的后缀自动机上边分树合并。。。TM什么毒瘤玩意考虑选择两个极长重复子串来计算答案,其实就是两个上一位不同的后缀的lcplcplcp。假设这个lcplcplcp长度为kkk,则它对答案的贡献为:∑i=max(k+1−k2,1)min(k,k1)...原创 2019-07-29 16:46:49 · 241 阅读 · 0 评论 -
【BZOJ3879】SvT(后缀数组)(单调队列)
传送门题解:后缀排序,预处理LCP询问。单调队列,合并两个块的时候算答案。没了。好写常数还小。代码:#include<bits/stdc++.h>#define ll long long#define re register#define gc get_char#define cs constnamespace IO{ inline char get_c...原创 2019-07-22 19:23:13 · 155 阅读 · 0 评论 -
【WOJ2856】Mushroom 的字符(后缀数组)(链表)
题解:首先我们知道直接求一个串的本质不同的子串可以用SAM,只需要每次新加入节点之后计算len[u]−len[fa]len[u]-len[fa]len[u]−len[fa]加入答案就行了。但是这道题需要删除前面的点,所以用不了这种方法。还有一种方法就是用SA,求出hththt数组之后计算每个位置开始的点对答案的贡献就行了。我们知道一个串子串的hththt数组是可以从原来的hththt数组中间...原创 2019-07-17 11:28:07 · 181 阅读 · 0 评论 -
2019.01.01【AHOI2013】【BZOJ3238】【洛谷P4248】差异(后缀数组)
BZOJ传送门洛谷传送门解析:想要绝对的O(n)O(n)O(n)过这道题,你必须要会后缀数组的O(n)O(n)O(n)构建方法SA-IS,不要想着大常数的DC3能够跑的比SAM快。。。但是O(n)O(n)O(n)确实比O(n×∣A∣)O(n\times |A|)O(n×∣A∣)快到不知道哪里去了。目前本人洛谷rk1,BZOJrk2。在我前面的是本校工程大佬xehoth,但是码长是我的...原创 2019-01-01 15:30:34 · 262 阅读 · 0 评论 -
2018.12.22【TJOI2015】【BZOJ3998】【洛谷P3975】弦论(后缀数组SA)
BZOJ传送门洛谷传送门解析;后缀数组O(n)O(n)O(n)解法,比后缀自动机O(n∗sigma)O(n*sigma)O(n∗sigma)不知道高到哪里去了。思路:首先,要做到真正的O(n)O(n)O(n),你需要会O(n)O(n)O(n)构造后缀数组,然而O(nlogn)O(n\log n)O(nlogn)也能过。但是你要是O(n)O(n)O(n)写的是DC3DC3DC3而不是...原创 2018-12-22 16:47:40 · 704 阅读 · 0 评论 -
2018.12.15【UOJ35】后缀排序(各种做法(包括SAM))
传送门解析:SAM以外的其他做法:https://blog.youkuaiyun.com/zxyoi_dreamer/article/details/84667881SAM做法:在反串上建出SAM,标记每一个反串的前缀终止位置(即原串的后缀起始位置),保留fail树。留下来的fail树就是原串的后缀树。在后缀树上按照字典序进行DFS将遇到的标记一一收回,就完成了后缀数组的构建。没听懂?回去学习...原创 2018-12-15 14:22:58 · 366 阅读 · 0 评论 -
2018.12.01【SPOJ220】Relevant Phrases of Annihilation(后缀数组)(二分答案)
传送门解析:套路题。首先串成一串求一下SA。然后按照二分出的lenlenlen,根据heightheightheight数组分组。在每组里面看kkk个串是否分别满足条件就行了。代码:#include<bits/stdc++.h>using namespace std;#define ll long long#define re register#define ...原创 2018-12-01 14:06:36 · 205 阅读 · 0 评论 -
208.11.30【SPOJ694/705】New Distinct Substrings(后缀数组)
SPOJ694传送门SPOJ705传送门解析:后缀数组水题。思路:考虑每个后缀有多少个前缀是没有出现过的。那么答案显然是∑len−sai+1−hti\sum len-sa_i+1-ht_i∑len−sai+1−hti。代码:#include&lt;bits/stdc++.h&gt;using namespace std;#define ll long long#def...原创 2018-11-30 23:51:11 · 150 阅读 · 0 评论 -
【模板】后缀数组SA
参考题目:UOJ35解析:这次贴的代码有点多,除了最裸的暴力,基本上能够想到的其他各种复杂度能够过和不能过的我都去写了一遍。但是解析可能要不知道什么时候更了。。。之后会把后缀数组所有用途和性质都更新过来的。代码:哈希二分+快速排序(复杂度O(nlog2n)O(n\log^2n)O(nlog2n)):#include&lt;bits/stdc++.h&gt;using name...原创 2018-11-30 20:59:07 · 256 阅读 · 0 评论