字符串匹配问题
- (后缀函数)给定串 \(A,B\),对于每个 \(A\) 的前缀 \(A[1,i]\),求出它的最长的后缀 \(A[j,i]\),满足 \(A[j,i]\) 是 \(B\) 的前缀。
KMP 求出 \(B\) 的 next 数组,然后对 \(A\) 做匹配。
- (前缀函数)给定串 \(A,B\),对于每个 \(A\) 的后缀 \(A[i,n]\),求出它的最长的前缀 \(A[i,j]\),满足 \(A[i,j]\) 是 \(B\) 的前缀。即,求出 \(A\) 的每个后缀和 \(B\) 的 LCP。
求出 \(B\) 的 Z 函数,然后使用基于右端点单调的摊还 \(O(n)\) 匹配。
- 给定串 \(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)})\)。

浙公网安备 33010602011771号