hdu 2087 剪花布条
#include <stdio.h>
#include <string.h>
#define MAXN 1005
char str[MAXN],pat[MAXN];
int nextval[MAXN];
void getNextval(int len)
{
int j=0,k=-1;
nextval[0]=-1;
while(j<len)
{
if(k==-1 || pat[j]==pat[k])
{
++j;
++k;
//next[j]=k;
if(pat[j]==pat[k]) nextval[j]=nextval[ nextval[k] ];
else nextval[j]=k;
}
else k=nextval[k];
}
}
int kmp(int len,int plen)
{
getNextval(plen);
int i=0,j=0,cnt=0;
while(i<len && j<plen)
{
if(j==-1 || str[i]==pat[j])
{
++i;
++j;
if(j==plen)
{
cnt++;
j=0;
}
}
else j=nextval[j];
}
return cnt;
}
int main()
{
while(scanf("%s",str))
{
if(str[0]=='#') break;
scanf("%s",pat);
int len1=strlen(str),len2=strlen(pat);
printf("%d\n",kmp(len1,len2));
}
return 0;
}
浙公网安备 33010602011771号