字符串专题
一直以来字符串和数论都是我的弱项,是时候从字符串开始改善一下了。
然而有些题目并不会写代码,只是给个一句话题解。
2019.4.6
CF1073G Yet Another LCP Problem
后缀数组,lcp转换为求区间min。
分别统计a到b、b到a的贡献,单调栈搞一搞。
位置重合时特殊处理。
CF963D Frequency of String
随便用什么数据结构统计每个串出现的位置,然后暴力做。
由于保证询问字符串互不相同,可以一波分析复杂度发现是\(O(n\sqrt{n})\)。
没意思,不写。
CF961F k-substrings
固定左右端点时长度不满足单调性,很不舒服。
但是可以发现固定中点时向左右扩展,此时具有单调性,可以二分+哈希判相等。
没什么代码难度,不写。
CF653F Paper task
如果没有本质不同的要求可以前缀和+ST表随便搞。
加上本质不同的要求后可以用后缀数组给每个左端点一个右端点的限制,就做完了。
CF557E Ann and Half-Palindrome
氧化钙。
\(O(n^2)\)的暴力能过,那还做个鬼啊。
CF526D Om Nom and Necklace
两个互不相关的字符串杂在一起非常不爽,设S=AB,那么合法的串就会长得像SSS……SSA的样子,其中A是S的前缀。
那么可以枚举S的长度,二分A的长度,哈希即可。
2019.4.8
CF1037H Security
显然,要得到答案,必然要使lcp最长,然后最后一个字符略大。
那么可以建出SAM,把串丢上去看看最长lcp有多少,然后从大往小枚举。
但是有一个\([l,r]\)的限制,就需要维护每个节点所对应的那些串在哪里出现过。
于是可以维护一下endpos集合,用线段树合并即可。
CF524F And Yet Another Bracket Sequence
就是一道SB题,我竟然搞了2个小时……
按照往左的括号多还是往右的多,分类讨论。
用后缀数组排序一下,枚举从哪里断开,判一下是否合法,若合法直接输出就好了。
2019.4.9
CF504E Misha and LCP on Tree
第一反应倍增+哈希,不过似乎并不能过(网上没有题解)
题解写的是树剖+后缀数组,好像也很有道理。
由于太裸,代码就咕咕咕了……
CF452E Three strings
套路题。
首先思考只有一个\(l\)的时候怎么做,显然可以用后缀数组的height数组处理出合法区间然后计算。
多个\(l\)时按照套路,用并查集。按height数组排序,从大到小插入,相当于合并两个区间,乱搞一通即可。
CF86C Genetic engineering
显然可以转换为能被模式串完全覆盖的串的数量。
很容易想到逐位DP,记录当前长度、未匹配长度和最后几位的状态。关键在于如何记录状态。
发现AC自动机很完美地搞定了这一任务,于是就做完了。
注意以每个节点结尾的串的最大长度要考虑到fail。(应该只是我AC自动机不熟练才会犯这样的错误)
2019.4.10
CF232D Fence
套路题。
很容易想到差分,然后取相反数复制一遍。
然而有个不能重叠的麻烦条件,就还要套个主席树。
CF822E Liar
显然可以DP。x那么小,把它丢到状态里,就ok了。
一开始写了个逐位DP,不知怎么WA掉了,改成后缀数组每次匹配lcp就过了。
CF204E Little Elephant and Strings
非常显然的思路是枚举每一个位置为开头,看往右能延伸多少。延伸的长度显然可以二分。
然后建出后缀数组,用height数组二分出满足条件的区间。
最后用主席树维护一下区间属于不同的串的个数即可。
略码农,但细节不多。
简单一些的题也做了不少了,接下来可能会更倾向于做难题,然后发一整篇博客。
更新速度会降低,但(希望)题目质量会提高,至少模板题不会再有了。
update:由于博主太懒,而且现在见到字符串就想吐,可能会过很久才写。现在先去搞数论了。
洛谷P5284 [十二省联考2019]字符串问题
https://www.cnblogs.com/p-b-p-b/p/10695677.html
洛谷P4770 [NOI2018]你的名字
https://www.cnblogs.com/p-b-p-b/p/10704233.html