随笔分类 -  4.13.0 KMP

摘要:扩展KMP的应用 我们发现本题的关键在于如何高效的判断两个 同构字符串 的大小关系,想到如果能够预处理出每一个同构字符串与原字符串的最长公共前缀,那么直接比较它们不一样的部分就好,扩展KMP正好是用来处理这样的问题的,把原串copy一遍加在其后,在其上跑一遍exKMP的next数组,就预处理出了所有 阅读全文
posted @ 2017-12-07 22:00 Mr_Wolfram 阅读(199) 评论(0) 推荐(0)
摘要:扩展KMP解决这样一些问题: 给定两个字符串 S 和 T(长度分别为 n 和 m),下标从 0 开始,定义extend[i]等于S[i]...S[n 1]与 T 的最长相同前缀的长度,求出所有的extend[i]。 时间复杂度(n+m) cpp include include include inc 阅读全文
posted @ 2017-12-07 21:12 Mr_Wolfram 阅读(178) 评论(0) 推荐(0)
摘要:最大最小表示法与KMP求循环节 "最大最小表示法" 最大最小表示法与KMP求循环节的模板题, cpp include include include include include include using namespace std; const int MAXN=2000005; int in 阅读全文
posted @ 2017-12-07 14:25 Mr_Wolfram 阅读(128) 评论(0) 推荐(0)
摘要:最大最小表示法与去重 可以发现,题目中是求不同构环的数目,我们可以采用最大最小表示法,将它们都最大/最小表示出来,再判断有几个不同的, 可以使用string类,操作较为简单,也可以使用自定义struct 二维字符数组, 去重可以使用 sort+unique 可以使用 set 也可以字符串哈希 cpp 阅读全文
posted @ 2017-12-07 10:01 Mr_Wolfram 阅读(130) 评论(0) 推荐(0)
摘要:一道KMP的变式 本题仍是求最大前缀后缀,所以仍用KMP,但不同的是,本题有一个密码转换规则,不过好在题目中说了两段不重合,那么我们就可以在中间插入一个特殊符号' '',保证求next数组时不会越过中线,然后把前半段按对应关系转化成明文,求next数组就行,本题难点在于边界条件的处理。 尽可能向已知 阅读全文
posted @ 2017-12-03 21:53 Mr_Wolfram 阅读(131) 评论(0) 推荐(0)
摘要:KMP中next数组的妙用+DP 又是一道问前缀的题,显然是要用KMP,但是如果枚举每一个前缀,再到主串里跑KMP,会TLE,那么考虑DP,想到next数组的定义,并不用题目中的方法对于每一个前缀求在主串中出现了多少会,而是对于每一个前缀,求出以遍历过得前缀在该前缀中出现了多少次,所以dp[i]=d 阅读全文
posted @ 2017-12-03 20:19 Mr_Wolfram 阅读(147) 评论(1) 推荐(0)
摘要:KMP的应用 看到求字符串的的前缀与后缀,首先想到next数组,但是next所求的是同一个字符串中的最大前缀后缀,本题所求的是两个字符串中的最大前缀后缀,那么我们就求出第一个字符串的next数组,在第二个字符串上跑KMP,等到第二个字符串匹配完了以后,第一个字符串匹配到哪里就是所求的答案。 数组大小 阅读全文
posted @ 2017-12-03 19:28 Mr_Wolfram 阅读(144) 评论(0) 推荐(0)
摘要:这是一道利用KMP中next数组性质的题目,next[i]表示在字符串s中在i位置之前的的字符中的最大公共前缀后缀,那么我们就从nxt[len 1]开始 令k=nxt[len 1]判断是s[k]与s[len 1]是否相等,若相等则存下来,然后k=nxt[k],字符串的前缀一定是前缀的前缀。 阅读全文
posted @ 2017-12-02 10:53 Mr_Wolfram 阅读(147) 评论(0) 推荐(0)
摘要:这是一道求最小循环节的题,利用KMP的next数组求一个序列的最小循环节, 由next数组的定义可知,对于一个长为len的字符串来说,next[len]即为该字符串的最大公共前缀后缀, 所以该字符串的最小循环节为 len next[len], 本题因为对smemset置零,WA了好几次,但至今都不知 阅读全文
posted @ 2017-12-01 15:04 Mr_Wolfram 阅读(192) 评论(0) 推荐(0)
摘要:```cpp include include include include include include const int MAXN=1000000+5; using namespace std; char s1[MAXN],s2[MAXN]; int nxt[MAXN]; void getn 阅读全文
posted @ 2017-11-30 20:40 Mr_Wolfram 阅读(154) 评论(0) 推荐(0)