随笔分类 -  字符串

摘要:A. All with Pairs 参考:A. All with Pairs (哈希值+next) 需要用到的东西是字符串哈希和前缀数组。 首先用字符串哈希将每一个后缀都统计一下,并用不同的后缀会映射为不同的哈希值,所以这样就可以在$O(1)$的时间复杂度内比较出两个字符串是否一样。 还要考虑到的事 阅读全文
posted @ 2020-07-16 12:59 caoanda 阅读(161) 评论(0) 推荐(0)
摘要:A. B-Suffix Array 参考:2020年牛客多校A题 将字符串化为B数组之后,会发现,它其实是由两部分组成的。例如aaaabaaab的B数组为011102114,那么我们可以将B拆成两半,前面一部分是01110,后面一部分是2114。我们会发现,所有长度的B数组前面部分的格式都是一样的, 阅读全文
posted @ 2020-07-15 09:17 caoanda 阅读(214) 评论(0) 推荐(0)
摘要:"D2. Prefix Suffix Palindrome (Hard version)" 参考: "Codeforces Global Round 7 — Editorial" 关键在于会利用马拉车算法求最长回文串。 阅读全文
posted @ 2020-05-15 11:35 caoanda 阅读(174) 评论(0) 推荐(0)
摘要:Manacher 参考: "Manacher" 模板题: "P3805 【模板】manacher算法" 用于求最长回文串,复杂度为$O(n)$,其中 表示以 i 为中心的长度为奇数的回文子串,如 中, ,`d2[i] baab d2[1]=0,d2[2]=2` 马拉车算法的关键在于利用回文串的对称性 阅读全文
posted @ 2020-05-14 22:12 caoanda 阅读(158) 评论(0) 推荐(0)
摘要:"C Cow and Message" 对于字符串问题,如果对于下标进行操作复杂度很大的话,可以考虑对字母进行操作,这样计算复杂度的时候就是对26进行计算了。 阅读全文
posted @ 2020-03-03 11:52 caoanda 阅读(141) 评论(0) 推荐(0)
摘要:"D Shortest and Longest LIS" 因为要使最长上升子序列分别为最小和最大,所以可以先分别让序列为 和`1 2 3...n 2 n 1 n`,然后再让序列满足题给条件,要注意的是连续的“”应该进行翻转操作。 通过这道题应该想到的东西是,题给条件所要求的“ ”、” define 阅读全文
posted @ 2020-02-16 13:46 caoanda 阅读(216) 评论(0) 推荐(0)
摘要:"E Erase Subsequences" 参考: "Educational Codeforces Round 82 A~E 题解" 该题数据范围只有400,所以可以使用$O(n^3)$的写法。 $dp[i][j]$表示在 s 的第 i 个位置(从1开始)和 t1 的第 j 个位置,能够满足的 t 阅读全文
posted @ 2020-02-13 18:07 caoanda 阅读(154) 评论(0) 推荐(0)
摘要:"E2. String Coloring (hard version)" 首先我们要明确一点,最多只会出现26种颜色,因为当下字母 如果在后面 出现过,那么在 i 这个位置的最佳颜色选择即为先前确定的颜色。所以我们可以使用状态压缩来记录状态。 阅读全文
posted @ 2020-02-05 19:16 caoanda 阅读(184) 评论(0) 推荐(0)
摘要:"D. Irreducible Anagrams" 存在$irreducible\ anagram$只有三种情况: ①长度为1 ②长度为2,且 ③长度大于2 ①和③很容易可以得出,这里只证明一下情况② 假设只存在 a,b,开头和结尾都是 a,那么匹配肯定是这样的:$\begin{cases}a... 阅读全文
posted @ 2020-02-03 15:33 caoanda 阅读(214) 评论(0) 推荐(0)
摘要:路径还原 例如在求解最短路等等问题时,只需用一个 数组在更新我们要求的数据时,记录一下前驱顶点即可 阅读全文
posted @ 2020-01-18 09:11 caoanda 阅读(318) 评论(0) 推荐(0)
摘要:string的插入和删除 参考: "string插入和删除" 插入(字符串和字符): 删除: 阅读全文
posted @ 2020-01-18 08:44 caoanda 阅读(877) 评论(0) 推荐(0)
摘要:string中find()和substr()的用法 查找从指定位置开始的 当找不到的时候,函数会返回一个 找第一个目标字符串的位置和最后一个的位置(不是全匹配): 在使用 函数的时候一定要注意里面的参数,第一个是起点,第二个是长度! 阅读全文
posted @ 2020-01-17 19:45 caoanda 阅读(638) 评论(0) 推荐(0)
摘要:最长公共子序列 注:子序列是可以不连续的。 递推公式: $dp[i+1][j+1]=\begin{cases}dp[i][j]+1&(s_{i+1}=t_{j+1})\\max(dp[i][j+1],dp[i+1][j])&(其 他)\end{cases}$ 代码: 阅读全文
posted @ 2020-01-14 18:19 caoanda 阅读(90) 评论(0) 推荐(0)
摘要:" F. Equalizing Two Strings " 有几种情况可以直接判定结果: ① 字母对应个数不一样,可直接判NO ② 当不满足①时,如果有一个字母有2个及以上的个数,也可直接判YES ③ 当不满足①②时我们可以知道,此时的字符串最多也只有26个字符,所以可以直接暴力,一个字符串只交换相 阅读全文
posted @ 2019-11-07 18:27 caoanda 阅读(174) 评论(0) 推荐(0)
摘要:"L Common Subsequence" 参考: "ACM POJ 1458 Common Subsequence (最长公共子序列,动态规划)" 思路:二维动态规划。 :在截止至 的`i 1 s2 j 1`位置,两个串的最长公共子序列长度。 动态规划方程: 即如果 ,则表示当前最长公子序列可加 阅读全文
posted @ 2019-11-05 14:13 caoanda 阅读(182) 评论(0) 推荐(0)
摘要:"E. Compress Words" 直接套 KMP 即可(那为什么打 cf 的时候没有想到...),求出后一个单词(word)的前缀数组,然后从前面已得的字符串的末尾 word. length () 开始查询利用 "前缀数组" 进行优化即可 代码: cpp // Created by CAD o 阅读全文
posted @ 2019-08-12 16:12 caoanda 阅读(214) 评论(0) 推荐(0)
摘要:"F. String Compression" 利用dp和 "前缀数组" 来写 dp[i] 所表示的东西是 字符串 s[0:i] (不包括 s[i])能够压缩的最短长度 bj[i][j] 表示的是字符串 s[i:j+1] (不包括 s[j+1])能够压缩的最短长度 代码: cpp // Create 阅读全文
posted @ 2019-08-09 11:51 caoanda 阅读(157) 评论(0) 推荐(0)
摘要:前置技能: "前缀数组" 参考博客: "KMP算法(kuangbin)" cpp const int maxn=1e5; int Next[maxn]; / 求前缀数组 / / t[0]对应Next[1] / / Next[0]= 1 / void getNext(string t) { int i 阅读全文
posted @ 2019-08-09 00:29 caoanda 阅读(223) 评论(0) 推荐(0)
摘要:参考博客: "KMP算法(kuangbin)" 另讲得比较好的博客或网站: "前缀函数与 KMP 算法" "KMP算法(研究总结,字符串)" cpp const int maxn=1e5; int Next[maxn]; / 求前缀数组 / / t[0]对应的Next数组值为Next[1] / / 阅读全文
posted @ 2019-08-09 00:06 caoanda 阅读(1105) 评论(0) 推荐(0)