#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn = 10000;
void getFail(char* p, int* f) {///求失败函数f[i]
int m = strlen(p);
f[0] = 0; f[1] = 0;
for(int i = 1; i < m; i++) {///i指向文本串;
int j = f[i]; ///j指向模式串。
while(j && p[i] != p[j]) {
j = f[j];
}
f[i+1] = p[i] == p[j] ? j+1: 0;
}
}
int Find(char* T, char* p, int* f) {
int n = strlen(T), m = strlen(p);
getFail(p, f);
int j = 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("%d\n", i-m+1);
}
}
return 0;
}
int main()
{
int f[maxn];
char T[maxn], p[maxn];
gets(T);
gets(p);
Find(T, p, f);
return 0;
}
/*****************************
以前看了好多资料没看懂,
今天换种思路把KM算法看懂。
******************************/
字符串匹配(MP算法)
最新推荐文章于 2023-10-08 20:52:25 发布