KMP
来源:互联网 发布:大数据公司被收购 编辑:程序博客网 时间:2024/06/01 07:34
KMP模板
#include <cstdio>#include <string.h>#include <iostream>using namespace std;char T[1000], P[1000];int f[1000];void getf(){ int m = strlen(P); f[0] = 0, f[1] = 0; for(int i = 1; i < m; i++){ int j = f[i]; while(j && P[i] != P[j]) j = f[j]; if(P[i] == P[j]) j++; f[i+1] = j; }}void KMP(){ int n = strlen(T), m = strlen(P), flag = 0; getf();//预处理 int j = 0; //当前结点编号,起始点为0号结点 for(int i = 0; i < n; i++){ while(j && P[j] != T[i]) j = f[j]; if(P[j] == T[i]) j++; if(j == m) {printf("找到了,起始位置(字符串开头位置为1):%d\n", i-m+2); j = f[j]; flag = 1;} } if(flag == 0) printf("未找到匹配字符串\n");}int main(){ printf("请输入模板字符串:"); while(scanf("%s", T) != EOF){ getchar(); printf("请输入需要匹配的字符串:"); while(cin >> P && P[0] != '#'){ getchar(); KMP(); printf("请输入需要匹配的字符串:"); } printf("请输入模板字符串:"); } return 0;}
KMP算法例题
题目1 http://poj.org/problem?id=3461
//poj 3461 Oulipo 最简单的KMP题,找出第一个字符串在第二个字符串中出现次数。
#include <cstdio>#include <string.h>#include <iostream>using namespace std;char T[1000010], P[1000010];int f[1000010], flag;void getf(){ int m = strlen(P); f[0] = 0, f[1] = 0; for(int i = 1; i < m; i++){ int j = f[i]; while(j && P[i] != P[j]) j = f[j]; if(P[i] == P[j]) j++; f[i+1] = j; }}void KMP(){ int n = strlen(T), m = strlen(P); flag = 0; getf();//预处理 int j = 0; //当前结点编号,起始点为0号结点 for(int i = 0; i < n; i++){ while(j && P[j] != T[i]) j = f[j]; if(P[j] == T[i]) j++; if(j == m) { j = f[j]; flag++;} }}int main(){ int SUM; cin >> SUM; while(SUM--){ scanf("%s", P); getchar(); scanf("%s", T); KMP(); printf("%d\n", flag); } return 0;}
0 0
- KMP
- KMP
- KMP
- KMP
- KMP
- KMP
- kmp
- kmp
- KMP
- kmp
- KMP
- KMP
- KMP
- kmp
- KMP
- KMP
- kmp
- KMP
- 视图总结
- 2063. 【2016.10.4NOIP普及模拟】Exam
- 一个菜鸟java码农的成长之路(4):用LinkedList模拟栈结构
- 关于AXIS1.4实现webservice接口部署的基础实例
- 【NOIP2012模拟10.6】购买
- KMP
- 索引总结
- 《算法竞赛入门经典》第三章(蛇形填数)
- 从宏观到微观理解coding
- POJ 1984 Navigation Nightmare
- (Java)LeetCode-56. Merge Intervals
- LeetCode144—Binary Tree Preorder Traversal
- OpenCV 3.0 with Java Chapter 2 Handling Matrices
- 数据结构之线性结构 --循环单链表