如果你对KMP中,next【】的性质足够了解的话, 瞬秒
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
using namespace std;
char mat[200];
char pat[200];
int next[200];
void get_next(char *tem)
{
int k=-1;
int j=0;
int Len=strlen(tem);
next[0]=-1;
while(j<Len)
{
if(k==-1||tem[j]==tem[k])
{
++k;
++j;
if(next[j]==next[k])
next[j]=k;
}
else
k=next[k];//往前移k步。
}
}
int KMP(char *tem1,char *tem2)
{
get_next(tem2);
int i=0,j=0;
int sum=0;
int Len=strlen(tem1);
int Len1=strlen(tem2);
while(j<Len)
{
if(i==-1||tem1[j]==tem2[i])
{
++i;
++j;
}
else
{
i=next[i];
}
if(i==Len1)
{
sum++;
i=0;
// ++j;
}
}
return sum;
}
int main()
{
while(1)
{
// memset(mat,0,sizeof(mat));
// memset(pat,0,sizeof(pat));
scanf("%s",mat);
if(mat[0]=='#')
break;
scanf("%s",pat);
if(strlen(pat)>strlen(mat))
{
printf("0\n");
continue;
}
printf("%d\n",KMP(mat,pat));
}
return 0;
}