#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX = 1e3 + 5;
char arr1[MAX], arr2[MAX];
int nex[MAX];
void get_next(char* p, int* nex)
{
int k = -1, j = 0;
nex[j] = k;
int lenth = strlen(p);
while (j < lenth)
{
if (k == -1 || p[j] == p[k])
{
++k;
++j;
if (p[j] != p[k])
nex[j] = k;
else
nex[j] = nex[k];
}
else
k = nex[k];
}
}
int kmp(char* str, char* p)
{
get_next(p, nex);
int res = 0;
int lenth1 = strlen(str);
int lenth2 = strlen(p);
int i = 0, j =0;
while (i < lenth1)
{
if (j == -1 || str[i] == p[j])
{
// cout << "str[i]" << str[i] << " str[j] = " << str[j]
i++;
j++;
if (j == lenth2)
{
// cout << "j = " << j << endl;
res++;
j = 0;
}
}
else
{
j = nex[j];
}
}
return res;
}
int main()
{
while(scanf("%s", arr1))
{
if (arr1[0] == '#')
break;
scanf("%s", arr2);
memset(nex, 0 ,sizeof(nex));
printf("%d\n", kmp(arr1, arr2));
}
return 0;
}
匹配成功后,j置为0即可。
HDU 2087 剪花布条
最新推荐文章于 2019-04-16 19:23:42 发布