#include <cstdio>
#include <cstring>
const int N=100;
using namespace std;
int main()
{
char a[N],b[N];
int i,j,next[N],len1,len2,ans=0;
gets(a);len1=strlen(a);
gets(b);len2=strlen(b);
next[0]=-1;i=1;j=0;
for (i=1;i<len2;i++)
{
j=next[i-1];
while (j>=0&&b[i]!=b[j+1])
{
j=next[j];
}
if (b[i]==b[j+1])
{
next[i]=j+1;
}
else next[i]=-1;
}
i=0;j=0;
while (i<len1)
{
if (a[i]==b[j]) {i++;j++;if (j==len2) ans++;}
else
{if (j==0) i++;
else j=next[j-1]+1;}
}
printf("%d",ans);
}
练习poj3641(裸kmp)
#include <iostream>
#include <cstdio>
#include <cstring>
const int N=1000000,nn=10000;
using namespace std;
char a[N],b[nn];
int next[nn];
int main()
{
int n,p,i,j,len1,len2,ans;
scanf("%d",&n);
getchar();
for (p=0;p<n;p++)
{
ans=0;
gets(b);len2=strlen(b);
gets(a);len1=strlen(a);
next[0]=-1;i=1;j=0;
for (i=1;i<len2;i++)
{
j=next[i-1];
while (j>=0&&b[i]!=b[j+1])
{
j=next[j];
}
if (b[i]==b[j+1])
{
next[i]=j+1;
}
else next[i]=-1;
}
i=0;j=0;
while (i<len1)
{
if (a[i]==b[j]) {i++;j++;if (j==len2) ans++;}
else
{if (j==0) i++;
else j=next[j-1]+1;
}
}
printf("%d\n",ans);
}
}