zoukankan      html  css  js  c++  java
  • KMP字符串(AcWing 831)

    (kmp) O(n+m)O(n+m)
    kmp下标从1开始的话容易思考些。
    
    先理解匹配数组
    
    ababa的前缀为a,ab,aba,abab, 后缀为 a, ba, aba, baba, 前后缀都不包含自身
    
    那么匹配数组ne[1..5]为 0 0 1 2 3
    
    ne[1] = 0表示没有前后缀(因为前后缀不包含自身)
    
    那么s[i] != p[j+1] 时,令k=ne[j] ,k就是最长前缀=后缀长度
    由匹配数组ne的含义可知 p[1..k] = p[j-k+1..j]
    
    暴力做法从头枚举相当于p往右移动了1位,这样相当于p往右移动了多位,效率自然提升上来了。
    #include <iostream>
    
    using namespace std;
    const int M=100010;
    char s[M], p[M];
    int ne[M];
    int main(){
        int n, m, j, i;
        cin>>n>>p+1;
        cin>>m>>s+1;
     // 求next的过程
    for (i = 2, j = 0; i <= n; i ++){ while (j && p[j+1] != p[i]) j = ne[j]; if (p[j+1]==p[i]) j++; ne[i] = j; }

      //求kmp匹配的过程
    for (i = 1, j = 0; i <= m; i ++){ while(j && p[j+1]!=s[i]) j = ne[j]; if (p[j+1] == s[i]) j++; if (j == n) { cout<<i-j<<" "; j = ne[j]; } } return 0; }
  • 相关阅读:
    Visual Studio 2015 密钥
    Vue-next源码新鲜出炉一
    vue2.0基础整理
    Nest
    Nest
    Nest
    Nest
    Nest快速上手
    element-plus源码分析第一节
    获取视频第一帧,作为封面图
  • 原文地址:https://www.cnblogs.com/zyz010206/p/12383806.html
Copyright © 2011-2022 走看看