正好练习了一下kmd算法
剪花布条
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10515 Accepted Submission(s): 6774
abcde a3 aaaaaa aa #
0 3
#include "stdio.h"
#include "string.h"
int failure[10];
void creafailure(char *s)
{
int n=strlen(s),i,j;
failure[0]=-1;
for(j=1;j<n;j++)
{
i=failure[j-1];
while((s[j]!=s[i+1])&&i>=0)
i=failure[i];
if(s[j]==s[i+1]) failure[j]=i+1;
else failure[j]=-1;
}
}
int kmd(char *ss,char *as)
{
int i=0,j=0;
int lenthss=strlen(ss),lenthas=strlen(as);
while(i<lenthss&&j<lenthas)
{
if(ss[i]==as[j]) {
i++;j++;
}
else if(!j){
i++;
}
else
{
j=failure[j-1]+1;
}
}
return ((j==lenthas)?i:-1);
}
int main(void)
{
while(1)
{
int sum=0;
char ss[20],as[20],*p;
scanf("%s",ss);
if(ss[0]=='#') break;
scanf("%s",as);
p=ss;
creafailure(as);
while(1)
{
int x=kmd(p,as);
if(x!=-1){
p+=x;
sum+=1;
}
else break;
}
printf("%d\n",sum);
}
}