poj-3461 kmp字符串匹配问题

来源:互联网 发布:java 进阶书籍 编辑:程序博客网 时间:2024/06/06 17:19
#include <stdio.h>#include <string.h>#include <algorithm>using  namespace std;char  w[10001],t[1000001];int next[10001];int sum;void getNext(char* p, int next[])  {      int pLen = strlen(p);      next[0] = -1;      int k = -1;      int j = 0;      while (j < pLen)      {          //p[k]表示前缀,p[j]表示后缀            if (k == -1 || p[j] == p[k])          {              ++j;              ++k;               if (p[j] != p[k])                  next[j] = k;              else                  next[j] = next[k];          }          else          {              k = next[k];          }      }  }  void  kmp(char T[],char P[],int next[]){  int n=strlen(T),m=strlen(P);  int i,j;  getNext(P,next);  i=j=0;  while(i<n){      while(j!=-1 && T[i]!=P[j])j=next[j];    i++;j++;    if(j>=m){      sum++;      j=next[j];    }  }}int main(){  int T;  scanf("%d",&T);  while(T--){    sum=0;    memset(next,0,sizeof(next));    scanf("%s%s",w,t);    kmp(t,w,next);    printf("%d\n",sum);  }  return 0;}/*3BAPCBAPCAZAAZAZAZAVERDIAVERDXIVYERDIAN  130*/

0 0
原创粉丝点击