KMP模板

来源:互联网 发布:淘宝举报刷销量 编辑:程序博客网 时间:2024/06/16 01:45
#include <iostream>#include<string.h>#include<stdio.h>using namespace std;//p串在s串中出现的次数char s[1000001]; char p[10005];int next[10005];//next[i]  0-i字符串最大匹配数/** next[]的含义:x[i-next[i]...i-1]=x[0...next[i]-1]* next[i]为满足x[i-z...i-1]=x[0...z-1]的最大z值(就是x的自身匹配)next[i]=z;*/void getnext(char x[]){   int i,j,m;     next[0]=0;     next[1]=0;     m=strlen(x);    for(i=1;i<m;i++)    {       j=next[i];       while(x[i]!=x[j])       {           if(j==0)break;           j=next[j];       }       if(x[i]==x[j])       next[i+1]=j+1;       else next[i+1]=0;    }}int KMP(char x[],char y[]){//x是模式串,y是主串    int i,j;    int ans=0;    int m=strlen(x);    int n=strlen(y);    getnext(x);    j=0;   for(i=0;i<n;i++)  {    while(x[j]!=y[i])//如果发现失配了,j=next[j]的意思是找到j-1结尾的最长前缀等于最长后缀的下一个字符与y[i]比较,看相等与否    {        if(j==0)break;        j=next[j];    }    if(x[j]==y[i])j++;    if(j==m)     {      ans++;      j=next[j];     }  }return ans;}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        while(n--)        {            scanf("%s%s",p,s);          //  getnext(p);//            for(int i=0;i<=strlen(p);i++)//            {//                cout<<next[i]<<" ";//            }           printf("%d\n",KMP(p,s));        }    }    return 0;}/*5HAHAHAHA3WQNWQN1ADAADADADA3BABABBBABABABABABABABABB1DADADDAADAADDAAADAAD0*/

0 0