KMP字符串匹配


  1 #include<iostream>
2
3
4 using namespace std;
5
6 #define MAX 255
7
8 typedef unsigned char BYTE;
9
10 typedef BYTE String[MAX+1];
11
12 bool strAssign(String& strTemp,char* Temp); //定长字符串存储
13 bool strTravel(String& strTemp);          //打印
14 void KMP(String& strMother,String& strSon,int* pData);
15 void GetNext(String& strSon,int* pNext);
16                                         //KMP算法的实现要求两个子函数 KMP() 和GetNext()
17
18 void main()
19 {
20
21 String strMother;
22 memset(strMother,0,sizeof(strMother));
23
24 String strSon;
25 memset(strSon,0,sizeof(strSon));
26
27 strAssign(strMother,"HHHeHeHHe");
28 strAssign(strSon,"HeHe");
29
30
31 strTravel(strMother);
32 strTravel(strSon);
33 int* pData = (int*)malloc(sizeof(int)*(strMother[0]+1));
34
35 KMP(strMother,strSon,pData);
36
37 int i = 0;
38 for(i=1;i<=pData[0];i++)
39 {
40 cout<<pData[i]<<" ";
41
42 }
43 cout<<endl;
44
45 }
46 bool strAssign(String& strTemp,char* Temp)
47 {
48 strTemp[0] = strlen(Temp);
49
50
51 int i = 1;
52 for(i=1;i<=strTemp[0];i++)
53 {
54 strTemp[i] = Temp[i-1];
55
56 }
57
58 return true;
59
60 }
61 bool strTravel(String& strTemp)
62 {
63 int i = 1;
64 for(i=1;i<=strTemp[0];i++)
65 {
66 cout<<strTemp[i]<<" ";
67
68 }
69
70 cout<<endl;
71 return true;
72
73 }
74 void KMP(String& strMother,String& strSon,int* pData)
75 {
76 int* pNext = (int*)malloc(sizeof(int)*(strSon[0]+1));
77
78 GetNext(strSon,pNext);
79
80
81 int i = 1;
82 int j = 1;
83 int k = 1;
84
85 while(i<=strMother[0])
86 {
87 if(i==0||strMother[i]==strSon[j])
88 {
89 i++;
90 j++;
91
92 }
93 else
94 {
95 j = pNext[j];
96
97 }
98
99 if(j>strSon[0])
100 {
101 pData[k] = i-strSon[0];
102 k++;
103 j=1;
104
105 }
106
107
108 }
109
110
111 pData[0] = k-1;
112 free(pNext);
113
114
115 }
116 void GetNext(String& strSon,int* pNext)
117 {
118 pNext[1] = 0;
119
120 int i = 1;
121 int j = 0;
122
123 while(i!=strSon[0])
124 {
125 if(j==0||strSon[i]==strSon[j])
126 {
127 i++;
128 j++;
129
130 pNext[i] = j;
131
132
133
134 }
135 else
136 {
137 j = pNext[j];
138
139 }
140
141
142 }
143 }

KMP字符串匹配

时间: 2024-12-25 12:42:29

KMP字符串匹配的相关文章

Luogu P3375 【模板】KMP字符串匹配

P3375 [模板]KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了. 输入输出格式 输入格式: 第一行为一个字符串,即为s1(仅包含大写字母) 第二行为一个字符串,即为s2(仅包含大写字母) 输出格式: 若干行,每行包含一个整数,表示s2在s1中出现的位置 接下来1行,包括length(s2)个整数

洛谷P3375 [模板]KMP字符串匹配

To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了. 输入输出格式 输入格式: 第一行为一个字符串,即为s1(仅包含大写字母) 第二行为一个字符串,即为s2(仅包含大写字母) 输出格式: 若干行,每行包含一个整数,表示s2在s1中出现的位置 接下来1行,包括length(s2)个整

P3375 模板 KMP字符串匹配

P3375 [模板]KMP字符串匹配 来一道模板题,直接上代码. #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 5; int n, m; char s1[N], s2[N]; int nxt[N] ; void Get_next(char *s) { int j, L = strlen(s + 1); nxt[1] = j = 0; for(int i = 2; i

KMP字符串匹配 fzu2275重现赛POJ3167

KMP原理  点击 FZU 2275 Game 乍一看是个博弈的题目,实际上是重现里面比较简单的字符匹配. 只要B是0,那么A一定赢.只要A的长度小于B,那么B一定赢. 只有当A中可以搜索到B,也就是B或者B的反转是A的子串,那么A就可以赢. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <math.h> #inclu

FZU 2122 ——又见LKity——————【KMP字符串匹配】

Problem 2122 又见LKity Accept: 413    Submit: 1425Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 嗨!大家好,在TempleRun中大家都认识我了吧.我是又笨又穷的猫猫LKity.很高兴这次又与各位FZU的ACMer见面了.最近见到FZU的各位ACMer都在刻苦地集训,整天在日光浴中闲得发慌的我压力山大呀!于是,我准备为诸位编写一款小工具——LKity牌文本替

【洛谷】3375 KMP字符串匹配

[算法]KMP [题解][算法]字符串 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=1000010,maxm=1010; char A[maxn],B[maxm]; int p[maxm],n,m; int main() { scanf("%s%s",A+1,B+1); n=strlen(A+1);m=strlen

洛谷—— P3375 【模板】KMP字符串匹配

题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了. 输入输出格式 输入格式: 第一行为一个字符串,即为s1(仅包含大写字母) 第二行为一个字符串,即为s2(仅包含大写字母) 输出格式: 若干行,每行包含一个整数,表示s2在s1中出现的位置 接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值. 输

算法模板——KMP字符串匹配

功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置 原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单模板大量匹配待匹配串时,这个会有相当大的优势,AC自动机虽然好想一些,但是在这一类问题上的性价比就略低了 1 var 2 i,j,k,l,m,n:longint; 3 a:array[0..100000] of longint; 4 s1,s2:ansistring; 5 begin 6 readl

P3375 【模板】KMP字符串匹配(全程注释,简单易懂)

题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了. 输入输出格式 输入格式: 第一行为一个字符串,即为s1(仅包含大写字母) 第二行为一个字符串,即为s2(仅包含大写字母) 输出格式: 若干行,每行包含一个整数,表示s2在s1中出现的位置 接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值. 输