随笔分类 -  字符串——SA

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

点击右上角即可分享
微信分享提示