poj 3461 kmp

来源:互联网 发布:eclipse 运行java程序 编辑:程序博客网 时间:2024/05/22 12:38
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=1e6+9;int next[maxn];char a[maxn],b[maxn];int main(){//    freopen("in.txt","r",stdin);    int tcase;    scanf("%d",&tcase);    while(tcase--)    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        scanf("%s %s",&a[1],&b[1]);        next[1]=0;        int n=strlen(&a[1]);        int m=strlen(&b[1]);        for(int i=2;i<=n;i++)        {            int t=i-1;            while(t&&a[i]!=a[next[t]+1])            t=next[t];            next[i]=next[t]+(a[i]==a[next[t]+1]);        }        int ans=0;        for(int i=1,j=1;i<=m;i++)        {            while(j>1&&a[j]!=b[i])            j=next[j-1]+1;            if(a[j]==b[i])            {                if(j==n)                {                    ans++;                    j=next[j]+1;                }                else                j++;            }        }        cout<<ans<<endl;    }    return 0;}