• 复习下KMP&e-KMP


    KMP算法的核心思想是next数组。

    接下来,我来谈谈我对KMP数组的理解。

    KMP算法是用来匹配有多少相同字串的一种算法。

    1、next数组记录前缀与后缀相等的位置,然后跳到这。

    2、数组即记录后缀与前缀相等的个数

    如ABCABC

    那么next数组就是

    0 1 2 3 4 5 6
    -1 0 0 0 1 2 3

    KMP算法核心

    int next_[1000010];
    
    void kmp(char x[],int m,int next_[])
    {
        int i ,j;
        j = next_[0] = -1;
        i = 0; 
        while( i < m){
            while(-1!=j&&x[i]!=x[j]) j = next_[j];
            next_[++i] = ++j;
        }
    }

    返回x 在 y 中出现的次数,可以重叠

    int kmp_count(char x[],int m,char y[],int n)
    {
        int i,j;
        int ans = 0;
        kmp(x,m,next_);
        i = j = 0;
        while(i < n)
        {
            while(-1!=j && y[i]!=x[j]) j = next_[j];
            i++;j++;
            if(j >= m)
            {
                ans++;
                j = next_[j];
            }
        }
        return ans;
    }

    还可以预处理,这里就暂时不谈了

    e-KMP类似

    0 1 2 3 4 5 6
    6 0 0 3 0 0 0
  • 相关阅读:
    几种简单的博弈 1
    Luogu P2789 直线交点数
    搜索题简记
    并查集的妙用
    [qbzt寒假]线段树和树状数组
    [qbzt寒假]hash
    [qbzt寒假]Trie字典树
    博客阅读须知
    洛谷P1842 [USACO05NOV]奶牛玩杂技——题解
    2020SDOI游记
  • 原文地址:https://www.cnblogs.com/DWVictor/p/10486006.html
Copyright © 2020-2023  润新知