kmp 模板

来源:互联网 发布:打码识别软件 编辑:程序博客网 时间:2024/05/18 08:31
#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;int t,cnt,_next[maxn];char s[maxn],a[maxn];void get_next(char *s,int n){    int i=0,j=-1;    _next[0]=-1;    while(i<n)    {        while(j!=-1&&s[i]!=s[j])            j=_next[j];        i++;        j++;        if(j>=n)            _next[i]=_next[j-1];        else            _next[i]=j;    }}void kmp(char *a,int n,char *s,int m){    cnt=0;    get_next(s,m);    int i=0,j=0;    while(i<n)    {        while(j!=-1&&a[i]!=s[j])            j=_next[j];        i++;        j++;        if(j>=m)        {            j=_next[j];            cnt++;        }    }    printf("%d\n",cnt);}int main(){scanf("%d",&t);while(t--&&scanf("%s%s",s,a)!=EOF)        kmp(a,strlen(a),s,strlen(s));return 0;}