一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
abcde a3 aaaaaa aa #
0 3
ps:这道题就是求一个字符串中出现次数最多的子串,KMP中next数组求最大前缀后缀和就体现了这一特点。
july大神有一篇KMP讲解对于next数组讲解很清晰,建议新手或者对这这个知识点有疑惑的去看看!链接:点击打开链接
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s[1000], t[1000];
int next[1000];
int Kmp(char* s, int n, char* t, int m)
{
int i = 0, j = 0;
int c=0;
while(i < n)
{
if(j == -1 || s[i] == t[j])
{
++i;
++j;
if(j == m)
{
c++;
j=0;
}
}
else
{
j = next[j];
}
}
return c;
}
void getnext(char *t, int m)
{
int i = 0, j = 0;
next[0] = -1; j = next[i];
while(i < m)
{
if(j == -1 || t[i] == t[j])
{
next[++i] = ++j;
}
else
{
j = next[j];
}
}
}
int main()
{
while(scanf("%s", s) && strcmp(s,"#")!=0 )
{
scanf("%s", t);
int l1 = strlen(s);
int l2 = strlen(t);
getnext(t, l2);
printf("%d\n", Kmp(s, l1, t, l2));
}
return 0;
}