基础算法学习-- kmp

kmp模板

匹配字符串

//next存下的值是当前区间最大前缀与后缀重合的值。

#include<iostream>

using namespace std;

const int N = 100010,M = 1000010;

int n,m;
char p[N],s[M];
int ne[N];

int main(){
    //两个字符数组从下标1开始读入
    cin >> n >> p + 1 >> m >> s + 1;
    //赋值ne数组
    for(int i = 2,j = 0;i <= n; i ++){
        //不匹配或j == 0时将j推向next值,j == 0说明需要从头开始匹配
        while(j && p[i] != p[j + 1]) j = ne[j];
        //匹配成功,指针后移一位
        if(p[i] == p[j + 1]) j ++;
        //赋值
        ne[i] = j;
    }
    //kmp匹配
    for(int i = 1,j = 0;i <= m;i ++){
        //不匹配或j == 0时将j推向next值,j == 0说明需要从头开始匹配
        while(j && s[i] != p[j + 1]) j = ne[j];
        //匹配成功,指针后移一位
        if(s[i] == p[j + 1]) j ++;
        //子串符合,输出并寻找下一个值
        if(j == n){
            cout << i - n << ' ';
            j = ne[j];
        }
    }
    
    return 0;
}

KMP的意义

  1.KMP的ne数组的赋值就是查找自身上一个重合的子串
  
  2.ne数组的使用就是检查下一个出现最多字符的子串
posted @ 2021-04-18 15:25  Xuuxxi  阅读(48)  评论(0)    收藏  举报