随笔分类 - KMP
摘要:~~不想写题。不如写写算法总结?~~ KMP 前(che)言(dan) 以前都不知道 KMP 为什么叫 KMP ,现在才明白:该算法是三位大牛: D.E.Knuth 、 J.H.Morris 和 V.R.Pratt 同时发现的,以其名字首字母命名。 KMP 可以在O(n+m)的时间复
阅读全文
摘要:求出一个串使得这个串是s1,s2的子串。串中不包含s3。 如果没有这个s3就可以二分答案,然后height小于二分值分一组。看看每组里是不是出现过s1,s2的后缀。判断就行。 然后有了s3之后,我们考虑改变一下height数组。 我们把s1s2拼在一起构成一个新串s。(中
阅读全文
摘要:题意 给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. (n<=1000000) 题解 这种求最小循环节的题一般是KMP。 因为有一个很强的结论if(len%(len-nxt[len])==0)那这个字符串的最小环节为len-nxt[l
阅读全文
摘要:题意 题解 因为,一直用j=nxt[j]来遍历,可以遍历前i个字符所有相等的前后缀长度,所以有一个暴力的想法,就是对于每一个长度,开始遍历,记录长度小于i/2的相等的前后缀数量,最后累加即可。 但显然超时了。 换一种思路,其实我们要的只是长度小于i/2的相等的前后缀数量。 然后我们可以利用KMP的方
阅读全文
摘要:题意 给出一个字符串问有多少长度,使这个长度的前缀等于这个长度的后缀。 n<=400000 题解 考虑nxt数组的意义。我们发现构建nxt数组时,一直跳nxt数组就是在枚举,所有前缀和后最相等的长度。 所以我们求出nxt数组,然后一直跳nxt[len]就好了。
阅读全文
摘要:题意 求最小循环节出现次数。 题解 循环节可以用KMP求。 有一个结论是如果(len%(len-nxt[len])==0)那么最小循环节长度为len-nxt[len] 那么最小的循环节出现次数就是len/(len-nxt[len]) 那我们怎么证明呢 (黑色的方框代表nxt数组最长相等的前缀和后缀的
阅读全文