P3375【模板】KMP字符串匹配

  这道题其实几周前就已经切掉了,但是偶然间发现自己还没发博客,就来补一篇好了。

  KMP这个东西,网上讲得太复杂,其实很简单,也很容易解释。

  就是分为两部分:

  1. 先维护next数组(得先知道对next的定义吧?不知道可以上网查查)
  2. 利用已经求好的next来计算。

  提醒一下,注意边界判断。

  不会的可以直接看我的代码,反正很短,理解了定义,直接看代码就不会是问题。

  代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 1000005
char s[maxn],t[maxn];
int next[maxn],sum[maxn];
int main()
{
    scanf("%s",s+1);
    scanf("%s",t+1);
    int ss=strlen(s+1);
    int tt=strlen(t+1);
    //printf("%d",tt);
    int d=0,c=1,ans=0;
    next[1]=0;
    for(int i=2; i<=tt; i++)
    {
        int r=next[i-1];
        while(1)
        {
            if(r==0)
            {
                if(t[1]==t[i])
                {
                    r=1;
                    break;
                }
                else
                {
                    r=0;
                    break; 
                }
            }
            if(t[r+1]==t[i])
            {
                r=r+1;
                break;
            }
            r=next[r];
        }
        next[i]=r;
    }
    for(int c=1; c<=ss; c++)
    {
        if(t[d+1]!=s[c]&&d)
            d=next[d];
        if(t[d+1]==s[c])
            d++;
        if(d==tt)
        {
            d=next[d];
            ans++;
            sum[ans]=c-tt+1;
        }
    }
    for(int i=1;i<=ans;i++)
    printf("%d\n",sum[i]);
    for(int i=1; i<=tt; i++)
        printf("%d ",next[i]);
    return 0;
}

  如果你还没看懂,再去看看有关数组的定义,稀里糊涂不懂原理是学不好的。

  当然,我的方法可能有点笨,也请多包涵。

猜你喜欢

转载自www.cnblogs.com/popo-black-cat/p/10147195.html