UVA11019 矩阵匹配器

该博客介绍了如何解决UVA11019问题,即在一个大矩阵中查找小矩阵出现的次数,不考虑旋转。问题转化为二维字符串匹配,通过将小矩阵拆分为多行模板串并构建AC自动机进行处理。使用大矩阵的每一行在AC自动机中匹配,找出所有满足条件的点,并统计这些点的数量得出答案。此方法的时间复杂度接近于输入时间。
摘要由CSDN通过智能技术生成

题意简化,给你一个大矩阵和一个小矩阵,求小矩阵在大矩阵中出现了多少次,矩阵都不得旋转


这个题就是字符串匹配的二维版,然而不像数据结构,它的二维版并不复杂只是一行行拆开处理,但复杂度十分优越,几乎等于读入时间(vjudge上跑了0ms)

首先将小矩阵的每一行分开看,这样小矩阵就成了多个模板串,建个AC自动机。再用大矩阵的每一行去AC自动机里找匹配,例如大矩阵第i行的第j位与第k个模板串(小矩阵第k行)匹配上了,那么(i-(k-1),j)就是一个满足一行相等的右上角。开个C数组保存一个点作为右上角的小矩阵与目标小矩阵有几行一样,这样C[i][j]=x的点就是合法点。统计一下合法点的个数,即为答案

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define MAXN (1010)
using namespace std;
int A[MAXN][MAXN],B[MAXN][MAXN],n,m,x,y,son[MAXN*MAXN][151];
int Size,C[MAXN][MAXN],f[MAXN*MAXN],h[MAXN*MAXN],m1;
char S[MAXN];
struct edge{
	int next,to;
	void Add(int Next,int To){
		next=Next; to=To;
	}
}q[MAXN*MAXN];
void addedge(int x,int y){
	q[++m1].Add(h[x],y); h[x]=m1;
}
void Build(int Num){
	int rt=0,i,d;
	for (i&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值