POJ 3461 kmp

来源:互联网 发布:奢侈品复刻1:1淘宝 编辑:程序博客网 时间:2024/06/06 11:47

一道基础的kmp 

过了一个暑假仍是宝刀不老,直接写出next的算法

#include<iostream>#include<math.h>#include<cstdio>#include<cstring>using namespace std;  int next1[10009];  char s[10009],s1[1000009];  void get_next1(int n)  {      int i,j,k;      i=n;      j=0;      k=-1;      next1[0]=-1;      while(j<i)      {          if(k==-1||s[k]==s[j])          {              k++;              j++;              next1[j]=k;          }          else k=next1[k];      }  }  int change_kmp(int n,int m)  {      int i=0,ans=0,j=0;      while(i<n)      {          if(s[j]==s1[i]||j==-1)          {              j++;              i++;          }          else j=next1[j];          if(j==m)          {              ans++;              j=next1[j-1];//如果成功匹配一次ans++,之后假装失败在来一次匹配              i--;          }      }      return ans;  }int main(){    int t;    scanf("%d%*c",&t);while(t--){    gets(s);    gets(s1);    int len=strlen(s);    int n=strlen(s1);    get_next1(len);    printf("%d\n",change_kmp(n,len));}    return 0;}


0 0
原创粉丝点击