题目链接: hdu 2087 剪花布条
题目的意思是求有多少个子串,子串间没有重叠部分,所以是kmp水题
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1111111
using namespace std;
char s[maxn],p[maxn];
int Next[maxn],slen,plen;
void GetNext()
{
int i=0,j=-1;
plen=strlen(p);
Next[0]=-1;
while(i<plen)
{
if(j==-1||p[i]==p[j]) i++,j++,Next[i]=j;
else j=Next[j];
}
}
int kmp()
{
int i=0,j=0,cnt=0;
slen=strlen(s);
while(i<slen)
{
if(j==-1||s[i]==p[j]) i++,j++;
else j=Next[j];
if(j==plen) cnt++,j=0;//每次找到一个子串,然后数目加一,匹配串下标再次从0开始
}
return cnt;
}
int main()
{
while(scanf("%s",s)&&s[0]!='#')
{
scanf("%s",p);
fill(Next,Next+maxn,0);
GetNext();
printf("%d\n",kmp());
}
return 0;
}