exKMP

前置知识:KMP (似乎不会也行) , OI wiki

Problem

给定一个字符串 ss ,求 ss 的所有后缀和全串的最长公共前缀(匹配长度)

Solution

规定字符串下标以0开始记

定义 extiext_i 表示字符串从 ii 开始的后缀和全串的匹配长度

求解 extiext_i 时, ext0...i−1ext_{0...i-1} 应当被全部求出

下面推导 extiext_i :

找到 max⁡k∈[1...i−1](k+extk−1)\underset{k \in [1...i-1]}{\max} (k + ext_k -1) 中 kk 的值,定义 p=k+extk−1p = k + ext_k - 1

引理1:s[0...extk−1]=s[k...p]s[0...ext_k-1] = s[k...p]

定义 v=i−kv = i - k

引理2: s[v...extk−1]=s[i...p]s[v...ext_k-1] = s[i...p]

定义 l=exti−kl = ext_{i-k}

引理3:s[0...l]=s[i−k...i−k+l]s[0...l] = s[i - k...i - k + l]

在 i+l<pi + l < p 时,又满足

引理3ex:s[0...l]=s[i−k...i−k+l]=s[i...i+l]s[0...l] = s[i - k...i - k + l] = s[i...i+l]

综上,当 i+l<pi + l < p 时,exti=lext_i = l

但是,当 i+l≥pi + l \geq p 时 , 引理3ex在 pp 之后不满足相等(右边超出绿色的红色框位置)

所以从 i−pi-p 和 pp 位暴力枚举

找到最大相等位置更新 kk 和 extiext_i

注意:

  1. ext0=next_0 = n , 当 k=0k = 0 时不会更新 , 应当暴力求出 ext1ext_1 并且使得 k=1k =1
  2. 进行暴力匹配后应当更新 kk
  3. 注意 +1−1+1 -1 的细节

例题

【模板】扩展 KMP(Z 函数)

hint

没有hint


匹配统计

hint

模式串匹配串匹配方法类似,询问打桶

Author: cjh-hhz
Link: https://cjh-hhz.github.io/f4036cb5f1d5.html/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.