kmp模板----------------hdu1686

首先给出一个模式串 ss[],     然后给出一个主串 s[]。然后让你求 模式串在主串中出现的次数。

kmp模板题:一通则百通

#include<stdio.h>
#include<string.h>
char ss[100000],s[1000000]; //ss是模式串,      s是主串
int next[100000];
int cnt;
void getnext(int y)
{
 int i=0,j=-1;
 next[0]=-1;
 while(i<y)
 {
  if(j==-1||ss[i]==ss[j])
  {
   i++;
   j++;
   if(ss[i]==ss[j])
   next[i]=next[j];
   else
   next[i]=j;
  }
  else
  j=next[j];
 }
}
void kmp(int x,int y)
{
 int i=0,j=0;
 getnext(y);
 while(i<x)
 {
  if(j==-1||s[i]==ss[j])
  {
   i++;
   j++;
  }
  else
  j=next[j];
  if(j==y)
  {
   cnt++;
   j=next[j];
  }
 }
}
int main()
{
 int t;
 int x,y;
 scanf("%d",&t);
 getchar();
 while(t--)
 {
  scanf("%s%s",ss,s);          //s是主串,     ss是模式串
  x=strlen(s);
  y=strlen(ss);
  cnt=0;
  kmp(x,y);
  printf("%d\n",cnt);
 }
 return 0;
}

posted on 2012-03-12 07:33  hrbust_09zhangyabin  阅读(150)  评论(0编辑  收藏  举报