随笔分类 - ACM / String
摘要:原题链接 考察:字符串hash+二分 这道题和前面的查找子串的题一样用到二分,答案都具有单调性,但这道题的单调性不是上道题那么明显.本道题不是简单地枚举端点,如果枚举端点当然没有单调性,本道题是用中心扩展思想(不是第一次学,但我完全不记得).选取一个端点为中心,扩散到两边看是否为回文串.因为这道题是
阅读全文
摘要:原题链接 考察:hash+字符串的最大最小表示法 通过这道题发现之前的最小最大表示法可以从1开始还不用写三元表达式,就是之前的断环成链思想,这种取余的又要下标从1开始还是断环成链比较方便 关于这道题写写对于hash的思考 字符串hash多用于已知长度的字符串,下标是字符串的下标,hash值不允许为0
阅读全文
摘要:原题链接 考察:字符串匹配+hash优化+二分 错误思路: KMP算法是用于看一个串是否为另一个串的子串,这道题如果枚举子串,每个都求next数组再匹配时间复杂度是O(n^2) 求公共子串长度最好不要用KMP 正确思路: hash算法同样是枚举给定长度的字符串,但是hash不用求next数组,利用预
阅读全文
摘要:原题链接 考察: hash 错误思路: 直接用字符串hash,但是字符串hash是针对给定长度求前缀的hash,这里明显不能使用 错误思路2: 没有用变量给字符制造映射,而是直接用的ASCII码作映射,但是这样WA了,目前不知原因 正确思路: 重新给字符制造映射,下标从1开始 1 #include
阅读全文
摘要:原题链接 KMP+标准化+最大最小表示法 错误思路: 看到这题的第一反应是破环成链思想,枚举它能循环得到的字符串...算了下时间复杂度大概率TLE,看了别人的提示才反应过来是标准化... 正确思路: 像这种一种表示多种形态的字符串大概率用标准化了,我们用最小最大表示法求最大或最小值,用set或map
阅读全文
摘要:原题链接 考察: KMP+字符串的最小最大表示法 如果不懂字符串的最小最大表示法走这:GO (我认为是讲得很详细的) 当我们利用字符串的最小最大表示法求最小值和最大值下标后,直接利用next数组求循环节即可(如果最小/大值在循环字符串里出现多次,那么此字符串就可以构成循环节,并且循环节长度小于字符串
阅读全文
摘要:原题链接 KMP+前后缀匹配 别人眼里的模板题我能做N个小时... 错解思路: 将所给的未转化完成的字符串全部转化为第二种状态(即未翻译的状态),和上题一样的思路,将原串和新串和空格拼接在一起求公共前后缀,再利用公共前后缀求剩下的还未被纳入第二部分的原串.如果这样写易错点是aaaaa(密码文里a->
阅读全文
摘要:原题链接 如果直接枚举字符串前缀的子串,再将子串赋值到一个新串,就会O(n^2)超时,因此必须考虑优化 正确思路: 通过观察规律,我们可以发现当出现前缀在字符串出现次数为1的时候,后面包括这个前缀的新串,在字符串的出现次数也为1,经此优化即可 思路2: 根据ne数组计数,当ne[i]!=0时,ans
阅读全文
摘要:原题链接 KMP+字符串的运用 一开始计算错了时间复杂度,还以为可以直接暴力.... 错解思路: 求公共最长的前缀和后缀,如果直接将字符串拼接在一起,如果遇到这样的测试样例eg:s1 = aaa,s2 = aaa就会输出错误,所以我们必须分隔开s1和s2 正解思路: 我们不能让s2认为属于s1部分的
阅读全文
摘要:原题链接 求后缀凑成循环串还差几个字符 KMP练习 从前面的无线传输我们已经懂了怎么利用KMP求循环串长度,这里我们从尾下标就可以判断末尾是循环串的第几个字符 但这里有多种情况,分类讨论即可 1 #include <iostream> 2 #include <cstdio> 3 #include <
阅读全文
摘要:原题链接 翻译一下题目就是求主串里有多少个子串 数据很小,貌似暴力就能过.但写这道题主要是练习KMP 默写KMP模板,j回溯时不要ne[j]直接等于0即可 j = ne[j]是求重叠子串的本质 1 #include <bits/stdc++.h> 2 using namespace std; 3 c
阅读全文
摘要:原题链接 考察KMP的运用 错误思路: 我是求字符串中没有重合的最长前后缀,但这样的思路遇到cabc这样的测试数据显然是错误的,因为字符串复制时不一定会复制>=两遍 正解思路: 按上面的思路,如果字符串复制两遍及以上,那么j的最大值就是答案,如果字符串复制少于2遍,答案应该是公共前后缀的长度+没有公
阅读全文