KMP hihoCoder1015 KMP算法
来源:互联网 发布:ps3 linux 编辑:程序博客网 时间:2024/05/01 01:59
人太蠢,,看了一天的KMP。。
刚开始看训练指南的,,后来才惊奇的发现原来刘汝佳写的f数组并不是Next数组!
总觉得和之前看过的完全不一样。。。
后来又百度了一下KMP,研究了很久,然后用自己的逻辑写了一份
http://blog.chinaunix.net/uid-23767307-id-5033555.html
这个人把KMP大篇幅的讲了,,大家可以看看。。
个人认为只要能理解Next数组的意义后,写出KMP算法就不是很难了
然而自己语文也不好就不多做解释了,,直接贴下我的模板好了
#include<map>#include<set>#include<cmath>#include<stack>#include<queue>#include<cstdio>#include<string>#include<vector>#include<cstring>#include<iostream>#include<algorithm>#include<functional>using namespace std;const int MX = 1e6 + 5;char S1[MX], S2[MX];int Next[MX];int KMP(char *A, char *B) { int m = strlen(A), n = strlen(B); Next[0] = 0; for(int i = 1; i < n; i++) { int k = Next[i - 1]; while(B[i] != B[k] && k) k = Next[k - 1]; Next[i] = B[i] == B[k] ? k + 1 : 0; } int ans = 0, j = 0; for(int i = 0; i < m; i++) { while(A[i] != B[j] && j) j = Next[j - 1]; if(A[i] == B[j]) j++; if(j == n) ans++; } return ans;}int main() { int T, ansk = 0; //freopen("input.txt", "r", stdin); scanf("%d", &T); while(T--) { scanf("%s%s", S1, S2); printf("%d\n", KMP(S2, S1)); } return 0;}其中,如果想函数返回的是出现的次数,而不是匹配的次数
因为匹配的次数中会有一些部分是重叠的,那只要改一个地方就行了
把if(j == n) ans++;换成if(j == n) ans++, j = 0;就可以了
int KMP(char *A, char *B) {//A是被搜索的串,B是搜索的内容,返回B在A中出现的次数 int m = strlen(A), n = strlen(B); Next[0] = 0; for(int i = 1; i < n; i++) { int k = Next[i - 1]; while(B[i] != B[k] && k) k = Next[k - 1]; Next[i] = B[i] == B[k] ? k + 1 : 0; } int ans = 0, j = 0; for(int i = 0; i < m; i++) { while(A[i] != B[j] && j) j = Next[j - 1]; if(A[i] == B[j]) j++; if(j == n) ans++, j = 0; } return ans;}
0 0
- KMP hihoCoder1015 KMP算法
- hihoCoder1015 KMP算法
- hihocoder1015-kmp
- [hihocoder1015]KMP
- KMP Hihocoder1015 KMP
- hihocoder1015(KMP模板)
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- makefile 函数学习
- 新手笔记之print(?)
- HDU 5389 Zero Escape(dp啊 多校)
- 第85讲:Scala中For表达式的强大表现力实战学习笔记
- [leetcode] Delete Node in a Linked List 删除链表中的一个结点
- KMP hihoCoder1015 KMP算法
- HDU1253-胜利大逃亡
- GDOI2016模拟8.13挑选玩具
- 黑马程序员———Java基本语法
- 8_13_Java关系运算符和条件结构
- C 语言 switch case 优化和小技巧一发
- Linux时间子系统之三:时间的维护者:timekeeper
- Spring与JDBC连接实现对数据库的增删改查
- Android中的文本控件