http://acm.hdu.edu.cn/showproblem.php?pid=2087
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int nextssss[1005];
char str1[1005],str2[1005];
void getnextssss(int len)//此处也可以将int nextssss[]改写成 int* nextssss[]
{
int j,k;
j=0,k=-1;
nextssss[0]=-1;
while(j<len)
{
if(k==-1||str2[j]==str2[k])
{
j++,k++,nextssss[j]=k;
}
else
{
k=nextssss[k];
}
}
//利用待匹配串进行求解nextssss数组
}
int kmp(int len1,int len2)//kmp算法
{
int be=0;
int count=0;
int i=0,j=0;
getnextssss(len2);
while(i<len1)//是文本串长度;
{
if(j==-1||str1[i]==str2[j])
{
++i,++j;
}
else
{
j=nextssss[j];//j是位置;
}
if(j==len2)
{
if(i-be>=len2)//判断的是i,i指向的是文本串。
{
be=i;
count++;
j=nextssss[j];
}
}
}
return count;
}
int main()
{
int Case;
int len1,len2;
while(true)
{
scanf("%s",str1);
if(str1[0]=='#')return 0;
scanf("%s",str2);
len1 = strlen(str1), len2 = strlen(str2);
printf("%d\n",kmp(len1,len2));
}
return 0;
}
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=1000+100;
char S[MAXN],T[MAXN];
int next[MAXN];
int n,m;
int cnt,last;
void getFail()
{
next[0]=next[1]=0;
for(int i=1;i<m;i++)
{
int j=next[i];
while(j && T[i]!=T[j]) j=next[j];
next[i+1] = (T[i]==T[j])?j+1:0;
}
}//next数组模板
void KMP()
{
n=strlen(S);
m=strlen(T);
getFail();
int j=0;
for(int i=0;i<n;i++)
{
while(j && S[i]!=T[j]) j=next[j];
if(S[i]==T[j]) j++;
if(j==m)
{
if(cnt==0)
{第一次时不用判断
cnt++;
last=i;//last指向匹配位置的末尾
}
else if(i-last>=m)//如果找到了第二个及以后,那么需要判断一下此时匹配位置是否减去上//一个匹配位置>=m
{
cnt++;
last=i;
}
}
}
}
int main()
{
while(scanf("%s",S)==1)
{
if(strcmp(S,"#")==0)
break;
scanf("%s",T);
cnt=0;
KMP();
printf("%d\n",cnt);
}
return 0;
}