2019/4/22 kmp模板
Posted yuanweidao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019/4/22 kmp模板相关的知识,希望对你有一定的参考价值。
题目连接:传送门!!!
这里是从头到尾彻底理解KMP的一篇博客,写的非常好 :https://blog.csdn.net/v_JULY_v/article/details/7041827
题意:输入多组样例,每组给定一个模板串S,文本串T,问S在T中出现的次数
这道题主要是为了记录一下kmp的模板, 我太菜了,不能彻底理解 ,先记着吧
void getnext() //获得next数组 { next[0] = -1; int j = 0, k = -1; while(j < len1) { if(k == -1 || s1[j] == s1[k]) { j ++, k ++; next[j] = k; } else k = next[k]; } }
void kmp()//输出出现次数 { ans = 0; int j = 0, k = 0; while(k < len2)//遍历文本串 { if(j == -1 || s1[j] == s2[k]) { j ++, k ++; } else j = next[j];//模式串移动距离相当于 next[j] if(j == len1)//如果匹配到一次完整的模式串 ,出现次数++ { ans ++; j = next[j]; //回到模式串开头位置,重新找在文本串中找 } } printf("%d ", ans); }
void kmp()//输出模式串在文本串中的各个位置 ,没找到输出-1 { int flag = 0; int j = 0, k = 0; while(k < len2) //遍历文本串 { if(j == -1 || s1[j] == s2[k]) { j ++, k ++; } else j = next[j]; //回到上一个j位置字符的位置 if(j == len1) { if(!flag) printf("%d", k - j); else printf(" %d", k - j); flag = 1; j = next[j]; //回到模式串开头位置,重新找在文本串中找 } } if(!flag) printf("-1 "); else printf(" "); }
以上是关于2019/4/22 kmp模板的主要内容,如果未能解决你的问题,请参考以下文章