exKMP

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

Problem

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

Solution

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

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

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

下面推导 extiext_i

找到 maxk[1...i1](k+extk1)\underset{k \in [1...i-1]}{\max} (k + ext_k -1)kk 的值,定义 p=k+extk1p = k + ext_k - 1

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

定义 v=ikv = i - k

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

定义 l=extikl = ext_{i-k}

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

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

引理3ex:s[0...l]=s[ik...ik+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+lpi + l \geq p 时 , 引理3ex在 pp 之后不满足相等(右边超出绿色的红色框位置)

所以从 ipi-ppp 位暴力枚举

找到最大相等位置更新 kkextiext_i

注意:

  1. ext0=next_0 = n , 当 k=0k = 0 时不会更新 , 应当暴力求出 ext1ext_1 并且使得 k=1k =1
  2. 进行暴力匹配后应当更新 kk
  3. 注意 +11+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.