字符串匹配问题

  1. (后缀函数)给定串 \(A,B\),对于每个 \(A\) 的前缀 \(A[1,i]\),求出它的最长的后缀 \(A[j,i]\),满足 \(A[j,i]\)\(B\) 的前缀。

KMP 求出 \(B\) 的 next 数组,然后对 \(A\) 做匹配。

  1. (前缀函数)给定串 \(A,B\),对于每个 \(A\) 的后缀 \(A[i,n]\),求出它的最长的前缀 \(A[i,j]\),满足 \(A[i,j]\)\(B\) 的前缀。即,求出 \(A\) 的每个后缀和 \(B\) 的 LCP。

求出 \(B\) 的 Z 函数,然后使用基于右端点单调的摊还 \(O(n)\) 匹配。

  1. 给定串 \(A,B\),对于每个 \(A\) 的前缀 \(A[1,i]\),求出有多少个二元组 \((j,l)\) 满足 \(A[j,i] = B[l,l+(i-j)]\)

做法 1:

构造字符串 \(S = A + \# + B\),求出 SA 和 height 数组,按照 height 从大到小合并信息。

做法 2:

\(A\) 建立 SAM,然后当成 AC 自动机匹配。

具体地,对 \(B\) 从前往后跑匹配,不存在转移时就不断跳 link。

然后只需要求 link 链上的 \(\sum_{p} |endpos(p)|*(len_p-len_{link(p)})\),这个容易计算。

做法 3:

\(A,B\) 的广义 SAM,对每个状态求出两个 \(endpos\) 集合的大小,最后求 \(\sum_{p} |endpos_1(p)| * |endpos_2(p)| * (len_p - len_{link(p)})\)

posted @ 2026-05-13 16:20  _Bonely_Muffin  阅读(17)  评论(0)    收藏  举报