KMP/hash字符串问题
Anxdada
多读书多看报, 少吃零食多睡觉
展开
-
Hash 匹配字符串模板
板子: void init(char *s) //预处理主串的Hash前缀hash值和p的次方. { p[0] = 1; Hash[0] = 0; int k =strlen(s+1); for(int i=1;i<=k;i++) p[i] = p[i-1] * base; for(int i=1;i<=k;i++) Hash[i] = ...原创 2017-07-18 23:18:33 · 683 阅读 · 0 评论 -
新疆网络赛 G 题 Query on a string 【kmp/暴力匹配 + 树状数组 + 思维】
传送门 //题意: 给定一个字符串每次询问一个区间, 问可以匹配多少个子串. //思路: 因为子串的长度最大10. 那么每次修改最多只修改到10次. 所以我们可以直接暴力匹配就是了. 对于主串, 如果从某个开头可以匹配, 那么设那个开头的位置为1. 比如说样例就是 1000000. 这样对于询问的一个区间, 我们直接求前缀和就是了. 还有就是需要注意的几个小细节, 请看代码. 注意分清下标原创 2017-09-14 22:47:01 · 383 阅读 · 0 评论 -
HDU - 6153 A Secret 【kmp + 思维】
传送门 //题意: 就是问第二个串的每一个后缀在第一个串出现的次数*该后缀的长度然后在求和. //思路: 那么我们可以知道如果长的串都匹配了, 那么比它短的串也一定匹配了, 拿第二个例子说. aba匹配了, 自然ba, a也都匹配了. 但是有个问题就是可能会有遗漏. 比如这里的a应该是两次. 然后向后匹配不好写, 那么我们同时翻转两个字符串. 就可以正着进行kmp了. 只是对传统的kmp进行一原创 2017-09-20 19:14:07 · 380 阅读 · 0 评论 -
POj - 2752 Seek the Name, Seek the Fame 【next数组的理解】
传送门 //题意: 问从开头开始多长的序列前后缀是相同的. //思路: 还是对next的理解, 理解到了这种题就是水题. 其实做多看这种题就会发现, 只要把next数组写出来, 然后对next数组进行分析和理解, 很容易出答案的.AC Codeconst int maxn = 4e5+5; int cas=1; char zc[maxn], pp[maxn]; int s[maxn]; int原创 2017-09-12 22:24:42 · 280 阅读 · 0 评论 -
HDU - 1358 Period 【next数组的灵魂掌握】
传送门 //题意: 从第1个到第i个, 如果这一段的循环节>1, 则输出位置以及循环周期(即循环节个数) //思路: 还是由我上一篇博客给出的证明, 这篇博客给出了循环节以及循环节周期的证明, 刚好适用于这道题. (其实上一篇博客是这个的缩小版, 只用求全部, 而这道题是全部可能的循环节都要求, 即把每一个位置都可能作为串终止地方)AC Codeconst int maxn = 1e6+5; i原创 2017-09-12 21:47:53 · 312 阅读 · 0 评论 -
HDU - 3746 Cyclic Nacklace 【KMP next数组的深入理解】
传送门 //题意: 问使得最少让所有字符循环两次最少需要添加的字符数量. (如果循环次数超过两次, 但循环没有完整, 也必须添加一定的字符). //思路: next数组的深入理解, 首先我们可以很清楚的知道要先求循环节长度. 那么循环节长度可以直接通过 总长 - next[总长]得到. 这是证明 然后就可以直接判断输出了.AC Codeconst int maxn = 1e5+5; int c原创 2017-09-12 21:08:46 · 300 阅读 · 0 评论 -
SCU - 4438 Censor 【字符串好题】
传送门 //题意:每次从第二个串中删去第一个串, 输出最后剩下的串. //思路: 这道题是字符串一列比较经典的题目, 一般所有的求解字符串的题目都可以做. 我用的是KMP. 每次保存匹配到当前位成功匹配到了第一串目前匹配位置的前面的几个字符. 这样每次匹配到了一次第一个串后,k -= len, t = now[k-1] ,这样就又可以接着匹配了.AC Code/** @Cain*/ const原创 2017-09-14 23:25:06 · 569 阅读 · 0 评论 -
HDU - 5918 Sequence I 【kmp 变形】
传送门 //题意: 问有多少个起点满足每次跳p个单位可以匹配下面那个子串. //思路: 比较水的一个KMP变形. 每次我们跳k个单位进行kmp匹配就行了. 需要注意一点的但就是循环多少次了? 很显然的K次啊!!! 复杂度还是O(n+m)AC Code/** @Cain*/ const int maxn = 1e6+5; int zc[maxn], pp[maxn]; int Next[maxn]原创 2017-09-14 22:52:55 · 323 阅读 · 0 评论 -
KMP板子
纯板子: (原理懂了, 板子随便进行修改)next[i] 代表的是序列i之前构成的序列的最大公共前后缀的长度. 注意, next对应的字符串下标应该是从0开始的!!! 最好保持这个不变!!! 不要轻易去改动它!!! 字符版:const int maxn = 1e4+5; int cas=1; char zc[maxn], pp[maxn*100]; int Next[maxn];void get原创 2017-09-12 20:12:56 · 374 阅读 · 0 评论