给定一段长布条,然后给一个短布条,问从长的上能减下来几段短的布条
还是kmp要注意的是,匹配位置是不能重叠的,所以匹配后,指针需要清零
#include <iostream>
#include <map>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#define rep(i, j, k) for(ll i = j; i <= k; i++)
#define ll long long
#define maxn 1000009
#define inf 0x7fffffff
using namespace std;
int n, m;
char a[maxn], b[maxn];
int Next[maxn];
void pre ()
{
Next[0] = Next[1] = 0;
rep (i, 1, m - 1)
{
int j = Next[i];
while (j && b[i] != b[j])
j = Next[j];
Next[i + 1] = b[i] == b[j] ? j + 1 : 0;
}
}
int work ()
{
int j = 0, ret = 0;
rep (i, 0, n - 1)
{
while (j && b[j] != a[i])
j = Next[j];
if (b[j] == a[i])
j++;
if (j == m)
ret++, j = 0;
}
return ret;
}
int main ()
{
while (1)
{
scanf ("%s", a);
if (a[0] == '#')
break;
scanf ("%s", b);
m = strlen (b);
n = strlen (a);
pre ();
cout << work () << endl;
}
return 0;
}