acm 第三天:KMP

字符串匹配
动图:https://blog.csdn.net/lxt_Lucia/article/details/79762636

在这里插入图片描述

代码:

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

#define maxn 1000003
char F[maxn],T[maxn],P[maxn];
int m,n,d[maxn];
int ans=0,cnt=0;

void getF(char *P,int m)
{
    F[1]=0;
    for(int i=2;i<=m;++i)
    {
        int k=F[i-1];
        if(P[k+1]==P[i])
            ++k;
        else{
            while(k>0&&P[k+1]!=P[i])
                k=F[k];
            if(P[k+1]==P[i])++k;
        }
        F[i]=k;
    }
}
void getMatch(char*P,int m,char*T,int n)
{
    getF(P,m);
    int k=0;
    for(int i=1;i<=n;++i)
    {

        while(k&&T[i]!=P[k+1]) k=F[k];
        if(T[i]==P[k+1]) ++k;
        if(k==m)
        {
            //printf("matched at %d\n",i-m+1);
            d[cnt++]=i-m+1;
            ans++;
            k=F[k];
            //i+=m-1;
        }
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s %s",T+1,P+1);
        n=strlen(&T[1]);
        m=strlen(&P[1]);
        getMatch(P,m,T,n);
        if(ans)printf("%d\n",ans);
        else printf("Not Found\n");
        for(int i=0;i<cnt;i++)
            printf("%d ",d[i]);
        if(n>0)printf("\n");
        ans=0;cnt=0;
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_42748371/article/details/86497695