UVA11019 Martix Matcher --- AC自动机

UVA11019 Martix Matcher

题目描述:

给定一个(n*m)的文本串

问一个(x*y)的模式串出现的次数

AC自动机的奇妙使用

将(x*y)的模式串拆分成x个串,当x个串在同时被匹配时,认为原串被匹配

但是要区分匹配的行的差别,因此额外的附加一个二维数组(cnt)来表示匹配情况

记(cnt(i,j))表示以((i,j))为左上角的大小为(x*y)矩阵匹配了多少行。

将模式串拆成x个串,建成AC自动机

把文本串的n行放进去分别匹配,当枚举到文本串中的第i行第j个字符时,

如果匹配上了模式串中第k行,那么(cnt(i - k, j - y + 1) +1)

最后的答案即为(sum_{i=0}^{n-1} sum_{j=0}^{m-1} [cnt(i,j)==x])

复杂度O((T(n*m+x*y)))

但是,本题很坑

1.模式串可能有相同的两行,尽管模式串行结尾的fail指针不会互指,但是这种情况下要用链表储存

2.每次清AC自动机不要整个全部清,会带来极大的复杂度

3.尽量不要以1作为下标,讨论将变得很复杂

4.哈希的常数更优

5.本题卡常,如果过不去,考虑哈希

代码在此

原文地址:https://www.cnblogs.com/reverymoon/p/8882299.html