2021.1.31做题小结
1.[BJWC2011]Matrix
题意:单个母矩阵,判断多个矩阵是否为子矩阵
思路:二维hash
同时注意到使用 map 判断会T掉,但是用 unordered_map 不会
这是因为 map 是红黑树实现,优点在于其有序性,但空间要求高;unordered_map 是哈希表实现,优点在于查找速度快,但哈希表的建立比较耗时间
所以对于那些有顺序要求的问题,用map会更高效一些;对于查找问题,unordered_map会更加高效一些。
2.1734寻找子串位置加强
题意:给出字符串a和字符串b,请你输出b在a中第一次出现的位置
思路:kmp裸题
3.1737寻找字串
题意:同第2题,但母串更多
思路:双倍经验
4.[NOI2014]动物园
题意:http://fzuoj.xndxfz.com/problem/1739
思路:暴力:先求出所有的 next,再不断往上跳,那么跳到的节点中 (next<<1)<i 的个数即为num值
优化:递推,发现 num[i]=num[next[i]]+1
5.「USACO2015FEB」Censoring (Silver)
题意:http://fzuoj.xndxfz.com/problem/2680
思路:题目的难点在于处理删除操作。O(1)删除可以通过链表或者栈的方式
解决删除问题后,由于字串给定,所以直接 hash 可解,正解 kmp
另外一种 O(logn) 处理删除操作的方式是线段树(线段树大法好)
(想法源于:https://www.luogu.com.cn/blog/ywycasm/solution-p4824)
6.「BZOJ3916」friends
题意: http://fzuoj.xndxfz.com/problem/2456
思路:枚举插入的字符,判断剩下的字符串分成两部分后是否相同(hash)即可
总结:对于这种中间有一些奇奇怪怪的字符乱入 而 影响比较操作时 (Eg.day1.企鹅qq)
可以直接假设那一位不存在,然后使用 hash 快速判断
7.[poi2010]beads
题意:给定一个串S,选择一个 k,从 S[1] 开始,将S分为连续的若干段,使得每一段长度为k。令 cnt 为分出来不同的子串个数(翻转后相同算作相同),求最大的 cnt,以及有哪些 k 对应的为 cnt。
思路:枚举 k,求正反两个哈希去重。
注意点:反向hash求 [l,r] 哈希值<==>suf[l-len+1]-suf[l+1] /times pow[len] 其中,len=r-l
8.[poi2006]okr periods of words
题意:对于给定串的每个前缀i,求最长的,使这个字符串重复两边能覆盖原前缀i的前缀(就是前缀i的一个前缀),求所有的这些“前缀的前缀”的长度和
思路:利用 next[] 的性质:前缀i的长度为 next[i] 的前缀和后缀是相等的
这说明:如果有i一个公共前后缀长度为 j ,那么这个前缀 i 就有一个周期为 i-j
(讲得很清楚:https://www.luogu.com.cn/problem/solution/P3435 )
9.[USACO2011FEB]Cow Line
题意:康托展开
思路:模板题
10.「BZOJ2882」工艺
题意:最小表示法
思路:模板题
11.【模板】扩展KMP(Z函数)
题意:RT
思路:模板题