随笔分类 - 字符串——SA
摘要:XVII.[USACO17DEC]Standing Out from the Herd P 一个naive的思路就是将所有串拼一起然后后缀排序,找出所有连续的来自同一个串的后缀。考虑结合I.不同子串个数思考,则如果该区间是$[l,r]\sum\limits_{l\leq
阅读全文
摘要:XVI.[NOI2015]品酒大会 我居然能自己AC NOI的原题,后缀数组果然简单 首先当然是轻松建出SA。 我们考虑借鉴XII.[TJOI2015]弦论的思想,建出笛卡尔树。则对于当前的长度,它出现在了$(l,r)\dfrac{(r-l+2)(r-l+1
阅读全文
摘要:XV.Annihilate 我当年为什么会手贱开这卡常大毒瘤题呀 思路1. 用vector存下每个字符串在后缀排序后的下标,然后每次枚举两个串,用一个vector里面的数在另一个里面two-pointers找到它两侧的数,然后用ST表求LCP。 时间复杂度$O\Big(\sum|S|(\log\su
阅读全文
摘要:XIV.[SDOI2016]生成魔咒 动态SA?这怎么办? 我们考虑往每个后缀后面全都加入一个数。很明显,如果这样搞的话,你必须每加入一个数后都要重新后缀排序,不太可能完成。 这时,我们发现,如果这不是加入一个数,而是加入一整条后缀,那就会轻松很多,一个平衡树就能搞定。 思考后会发现,如果我们将整个
阅读全文
摘要:XIII.[BJWC2010]外星联络 和上题一样,没啥好说的,直接建出笛卡尔树即可。 代码: #include<bits/stdc++.h> using namespace std; int stk[500100],tp,L[500100],R[500100],id,pt; namespace S
阅读全文
摘要:X.[SCOI2012]喵星球上的点名 我居然做出了这题……难以置信! 首先,思路很明显是把所有串全怼一起(包括名字和询问串),加上分隔符,然后跑一遍后缀数组。 我们仍然可以用单调栈求出关于每个询问串与它相同的区间。即,如果以询问串为前缀的那个后缀的是的话,它的合法区间$[L,R]
阅读全文
摘要:IX.[JSOI2007]字符加密 这题的思路非常简单——断环复制成链,然后直接后缀排序一下即可。 为什么呢? 我们考虑两条后缀。假如它们在前位中有所不同,显然它们之间的相对顺序不会有问题; 否则,假如它们前位全都相同,则因为反正最后输出的就是最后一个字符,所以相对顺序没有影响,直接按照
阅读全文
摘要:VIII.[SDOI2008]Sandy的卡片 ……有什么意义吗…… 差个分,然后就是IV.[POI2000]公共串的内容了,套个单调队列,解决,假如你用DC3的话。 代码: #include<bits/stdc++.h> using namespace std; int all,n,m
阅读全文
摘要:VII.[HAOI2016]找相同字符 第一道自己做出的SA题祭~~~ 实际上和上一题没啥区别的说…… 我们发现,这题实际上就是对于两个串中所有的后缀求个前缀是相同的,即串中有这么多子串是相同的)。 老套路,俩串
阅读全文
摘要:VI.[AHOI2013]差异 这个柿子可以拆成两部分,即 \(\sum\limits_{1\leq i<j\leq
阅读全文
摘要:V.UVA11107 Life Forms 这题同上题类似,只不过把“在全部串中出现”变成了“在超过一半(即)个串中出现”。 这题中我的方法是上题中提到的“two-pointers+单调队列”算法。第一遍跑求出所有满足“出现
阅读全文
摘要:IV.[POI2000]公共串 后缀数组如何应对多个串的情况呢? 答案很简单:把所有串都拼起来! 但这又有个问题,拼起来的串不会出现一些错误吗? 没关系,这里就有解决方案了:在相邻的串间插入一个从未出现过的字符。 我们考虑在拼起来的字符串中求出数组。则仍然考虑二分公共子串长度,在$h
阅读全文
摘要:III.[USACO06DEC]Milk Patterns G 同上一题思路类似,我们仍然建出后缀数组。 考虑任何出现次的子串,以它们作为前缀的后缀在数组中一定是连续的——这一点可以从上文中的直接看出,因为相邻的结果一定大于等于不相邻的结果。 因此我们只需要求出数
阅读全文
摘要:II.[USACO5.1]乐曲主题Musical Themes 一个显然的思路就是差分,这样子在原数组中差相等,就转为差分数组中子串相同。 我们考虑建出后缀数组。 显然,这个答案可以二分,则我们二分一个长度。 考虑数组。我们在所有的地方切一刀,将数组切成多段
阅读全文
摘要:I.不同子串个数 后缀数组在处理子串问题时往往有奇效,因为后缀的前缀即是子串,而后缀数组正是按照前缀排序的后缀。 回到本题。因为后缀的前缀是子串,则一条后缀与其它所有后缀的LCP的最长长度,即是这条后缀的前缀子串中所有被重复计数的串的数量。 我们掏出求得的数组。初学SA时大家一定接触过一个重
阅读全文
摘要:X.[ICPC2019 WF]First of Her Name 这题的一种解法是把所有东西(名字串和翻转的询问串)建出一棵树来,然后跑树上后缀排序,用二分+哈希求出数组,然后使用单调栈找出每个位置最多能够向左向右延伸多远。但是按照某人的说法出题人好像出了卡此算法的数据,所以最后WA
阅读全文