KMP主要就是对每次移动的位置进行了优化
移动位数=当前失配前匹配的长度减去最大前缀后缀重叠长度
模板
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <stack>
using namespace std;
#define pb push_back
#define pi acos(-1)
const long long mod = 1000000007;
#define maxn 111111
#define maxm 11111
int makenext(const char s2[], int next[]) {
int m = strlen(s2);
next[0] = 0;
for(int q = 0, k = 0; q < m; q++) {
while(k > 0 && s2[q] != s2[k]) {
k = next[k - 1];
}
if(s2[q] == s2[k]) {
k++;
}
next[q] = k;
}
}
int kmp(const char s1[], const char s2[], int next[]) {
int n = strlen(s1);
int m = strlen(s2);
for(int i = 0, q = 0; i < n; i++) {
while(q > 0 && s1[i] != s2[q]) {
q = next[q - 1];
}
if(s1[i] == s2[q])
q++;
if(q == m) {
cout << "下标为" << i - m + 1 << endl;
}
}
}
int Next[maxn];
char s1[100];
char s2[100];
int main(){
while(scanf("%s%s", s1, s2) != EOF){
memset(Next, 0, sizeof Next);
kmp(s1, s2, Next);
}
return 0;
}