题意:
给定两个字符矩阵 (A) 和 (B) ,求 (A) 中有多少个子矩阵和 (B) 完全相同。
解答:
最开始毫无思路,但是我们可以根据 “二维字符矩阵匹配” 转化成 “一维字符串匹配”。
于是我们可以想到先将 (A) 和 (B) 的每一行都缩成一个字符串(去重),然后我们可以对 (B) 的所有串建立一个 (AC) 自动机,把 (A) 的每一个串放进去匹配。
对于一个字符串 (A_i) 来说,我们假设它在位置 (j) 开始匹配到了 (B_k) ,那么我们就把对应点 ((i,j)) 的编号设为 (k) 。
接下来相当于我们已经处理掉了横着的一维,对于列的一维,我们先将原 (B) 矩阵看成一个一维的编号数组。
然后我们对于 (A) 矩阵的每一列匹配这个一维编号数组就行了,实际上就是 KMP 匹配两个字符串即可。