//获取匹配个数
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005;
int nt[maxn];
char a[maxn], b[maxn];
void GetNext(char b[], int blen)
{
int j = 0, k = -1;
nt[0] = -1; --blen;
while(j < blen)
{
if(k == -1 || b[j] == b[k])
{
++j; ++k;
nt[j] = k;
}
else k = nt[k];
}
}
int KMP(char a[], char b[], int alen, int blen)
{
if(alen < blen) return 0;
int ans = 0;
if(blen == 1)
{
for(int i = 0; i < alen; ++i)
{
if(a[i] == b[0]) ++ans;
}
return ans;
}
int i = 0, j = 0;
GetNext(b, blen);
while(i < alen)
{
if(j == -1 || a[i] == b[j])
{
++i; ++j;
}
else j = nt[j];
if(j == blen)
{
++ans;
--i;
j = nt[j-1];
}
}
return ans;
}
int main()
{
int alen, blen;
cin >> a >> b;
alen = strlen(a);
blen = strlen(b);
cout << KMP(a, b, alen, blen) << endl;
return 0;
}
//判断是否存在匹配
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005;
int nt[maxn];
char a[maxn], b[maxn];
void GetNext(char b[], int blen)
{
int j = 0, k = -1;
nt[0] = -1; --blen;
while(j < blen)
{
if(k == -1 || b[j] == b[k])
{
++j; ++k;
if(b[j] == b[k]) nt[j] = nt[k];
else nt[j] = k;
}
else k = nt[k];
}
}
int KMP(char a[], char b[], int alen, int blen)
{
if(alen < blen) return 0;
if(blen == 1)
{
for(int i = 0; i < alen; ++i)
{
if(a[i] == b[0]) return 1;
}
return 0;
}
int i = 0, j = 0;
GetNext(b, blen);
while(i < alen && j < blen)
{
if(j == -1 || a[i] == b[j])
{
++i; ++j;
}
else j = nt[j];
}
if(j == blen) return 1;
return 0;
}
int main()
{
int alen, blen;
cin >> a >> b;
alen = strlen(a);
blen = strlen(b);
if(KMP(a, b, alen, blen)) cout << "YES" << endl;
else cout << "NO" << endl;
return 0;
}
//寻找首次出现位置
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005;
int nt[maxn];
char a[maxn], b[maxn];
void GetNext(char b[], int blen)
{
int j = 0, k = -1;
nt[0] = -1; --blen;
while(j < blen)
{
if(k == -1 || b[j] == b[k])
{
++j; ++k;
if(b[j] == b[k]) nt[j] = nt[k];
else nt[j] = k;
}
else k = nt[k];
}
}
int KMP(char a[], char b[], int alen, int blen)
{
if(alen < blen) return -1;
if(blen == 1)
{
for(int i = 0; i < alen; ++i)
{
if(a[i] == b[0]) return i;
}
return -1;
}
int i = 0, j = 0;
GetNext(b, blen);
while(i < alen && j < blen)
{
if(j == -1 || a[i] == b[j])
{
++i; ++j;
}
else j = nt[j];
}
if(j == blen) return i-blen;
return -1;
}
int main()
{
int alen, blen;
cin >> a >> b;
alen = strlen(a);
blen = strlen(b);
cout << KMP(a, b, alen, blen) << endl;
return 0;
}
//寻找所有匹配成功的在主串中的起点
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005;
int nt[maxn];
char a[maxn], b[maxn];
vector<int> vt;
void GetNext(char b[], int blen)
{
int j = 0, k = -1;
nt[0] = -1; --blen;
while(j < blen)
{
if(k == -1 || b[j] == b[k])
{
++j; ++k;
nt[j] = k;
}
else k = nt[k];
}
}
void KMP(char a[], char b[], int alen, int blen)
{
if(alen < blen) return;
if(blen == 1)
{
for(int i = 0; i < alen; ++i)
{
if(a[i] == b[0]) vt.push_back(i);
}
return;
}
int i = 0, j = 0;
GetNext(b, blen);
while(i < alen)
{
if(j == -1 || a[i] == b[j])
{
++i; ++j;
}
else j = nt[j];
if(j == blen)
{
vt.push_back(i-blen);
--i;
j = nt[j-1];
}
}
}
int main()
{
int alen, blen;
cin >> a >> b;
alen = strlen(a);
blen = strlen(b);
KMP(a, b, alen, blen);
for(int i = 0; i < vt.size(); ++i) cout << vt[i] << " ";
cout << endl;
return 0;
}
继续加油~