UVA11019 Matrix Matcher
思路
AC自动机匹配二维模式串的题目
因为如果矩形匹配,则每一行都必须匹配,考虑对于一个点,设count[i][j]记录以它为左上角的与模式矩形大小相同的矩形中有多少行和模式矩形匹配
然后把模式矩形的每一行插入AC自动机中,把文本矩形的每一行在上面跑,如果文本矩形第i行和模式矩形第c行匹配,匹配位置是j,则更新 counts[i-c+1][j+1-y+1]
最后每个count[i][j]等于x的(i,j)就是一个符合条件的点
小心重复的模式串。
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int Trie[10100][26],fail[10100],counts[1010][1010],root,Nodecnt,x,y,n,m;
char s[1010][1010],t[110][110];
vector<int> isend[10100];
void insert(char *s,int len,int inq){
int o=root;
for(int i=0;i<len;i++){
if(!Trie[o][s[i]-'a'])
Trie[o][s[i]-'a']=++Nodecnt;
o=Trie[o][s[i]-'a'];
}
isend[o].push_back(inq);
}
queue<int> q;
void build_AC(void){
for(int i=0;i<26;i++){
if(Trie[root][i]){
fail[Trie[root][i]]=root;
q.push(Trie[root][i]);
}
}
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=0;i<26;i++){
if(Trie[x][i]){
fail[Trie[x][i]]=Trie[fail[x]][i];
q.push(Trie[x][i]);
}
else
Trie[x][i]=Trie[fail[x]][i];
}
}
}
void query(char *s,int len,int inq){
int o=root;
for(int i=0;i<len;i++){
o=Trie[o][s[i]-'a'];
int p=o;
while(p){
if((isend[p].size()))
for(int j=0;j<isend[p].size();j++)
if((inq-isend[p][j]+1)>=1&&(i+1-y+1>=1))
counts[inq-isend[p][j]+1][i+1-y+1]++;
p=fail[p];
}
}
}
void init(void){
memset(Trie,0,sizeof(Trie));
memset(fail,0,sizeof(fail));
memset(counts,0,sizeof(counts));
for(int i=0;i<=Nodecnt;i++)
isend[i].clear();
Nodecnt=0;
root=0;
}
int main(){
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
int T;
Nodecnt=0;
root=0;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",s[i]);
scanf("%d %d",&x,&y);
for(int i=1;i<=x;i++){
scanf("%s",t[i]);
insert(t[i],y,i);
}
build_AC();
for(int i=1;i<=n;i++){
query(s[i],m,i);
}
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(counts[i][j]==x)
ans++;
printf("%d\n",ans);
init();
}
return 0;
}
UVA11019 Matrix Matcher的更多相关文章
- UVA11019 Matrix Matcher【hash傻逼题】【AC自动机好题】
LINK1 LINK2 题目大意 让你在一个大小为\(n*m\)的矩阵中找大小是\(x*y\)的矩阵的出现次数 思路1:Hash hash思路及其傻逼 你把一维情况扩展一下 一维是一个bas,那你二维 ...
- UVA11019 Matrix Matcher (AC自动机)
二维的矩阵匹配,把模式矩阵按列拆开构造AC自动机,记录行号(为了缩点判断). 把T矩阵按行匹配,一旦匹配成功,在假想的子矩阵左上角位置加一.最后统计总数. 因为所有模式串长度一样,不用维护last数组 ...
- UVA 11019 Matrix Matcher 矩阵匹配器 AC自动机 二维文本串查找二维模式串
链接:https://vjudge.net/problem/UVA-11019lrjP218 matrix matcher #include<bits/stdc++.h> using na ...
- UVA11019 Martix Matcher --- AC自动机
UVA11019 Martix Matcher 题目描述: 给定一个\(n*m\)的文本串 问一个\(x*y\)的模式串出现的次数 AC自动机的奇妙使用 将\(x*y\)的模式串拆分成x个串,当x个串 ...
- 【UVA11019】Matrix Matcher
Description Given an N × M matrix, your task is to find the number of occurences of an X × Y pattern ...
- AC自动机(二维) UVA 11019 Matrix Matcher
题目传送门 题意:训练指南P218 分析:一行一行的插入,一行一行的匹配,当匹配成功时将对应子矩阵的左上角位置cnt[r][c]++;然后统计 cnt[r][c] == x 的数量 #include ...
- UVA 11019 Matrix Matcher(ac自动机)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 11019 (AC自动机 二维模式串匹配) Matrix Matcher
就向书上说得那样,如果模式串P的第i行出现在文本串T的第r行第c列,则cnt[r-i][c]++; 还有个很棘手的问题就是模式串中可能会有相同的串,所以用repr[i]来记录第i个模式串P[i]第一次 ...
- uva 11019 Matrix Matcher
题意:给出一个n*m的字符矩阵T,你的任务是找出给定的x*y的字符矩阵P在T中出现了多少次. 思路:要想整个矩阵匹配,至少各行都得匹配.所以先把P的每行看做一个模式串构造出AC自动机,然后在T中的各行 ...
随机推荐
- linux安装rabbitmq以及相关的操作命令
1.安装rabbitmqa)进入rabbitmq文件的存放目录b)rpm -ivh rabbitmq-server-3.5.4-1.noarch.rpm2.修改配置cd /etc/rabbitmqcd ...
- Java课程寒假之开发记账本软件(网页版)之三
一.实现基础功能之一(查询)(补) 在上一篇中解释的不够详细,在本篇中补充一下指定日期查询,其实和查询没有什么区别,就是设置select下拉框来对于日期的起始与结束日期,然后就是一个简单的mysql语 ...
- Windows 平台下局域网劫持测试工具 – EvilFoca
简介 安全测试工具可能含有攻击性,请谨慎适用于安全教学及学习用途,禁止非法利用! EvilFoca是Windows环境下基于.NET FrameWork的一款轻量级的劫持测试工具.与BackTrack ...
- python 第三方扩展库的安装
主要就是采用 easy_install 和pip安装,一定要把这两个东西安装好.http://peak.telecommunity.com/DevCenter/EasyInstall下载ez_setu ...
- js的运用1
1.parselnt() 2.parsefloat() 遇到第一个字节是非数字就结束了. 3. var a="hello world" a这个变量是字符串了,对于里面 ...
- day20 二十、加密模块、操作配置文件、操作shell命令、xml模块
一.加密模块 1.hashlib模块:加密 ①有解密的加密方式 ②无解密的加密方式:碰撞检查 -- 1)不同数据加密后的结果一定不一致 -- 2)相同数据的加密结果一定是一致的 import hash ...
- ASP.NET Core 2.1 中 ViewResultExecutor 的变化
之前在 ASP.NET Core 2.0 中可以正常运行的代码: var services = HttpContext.RequestServices; var executor = services ...
- Web开发——HTML基础(图像、音频和视频内容)
参考: 参考:HTML中的图像 参考:视频和音频内容 目录: 1.HTML中的图像 1.1 我们如何在网页上放置图像? (1)替代文字(alt) (2)宽度和高度 (3)图片标题 1.2 用图形和图形 ...
- mybatis(二)--相关属性及相关细节
mapper接口动态代理 动态代理dao开发规则 1.namespace必需是接口的全路径名 2.接口的方法名 必需与 映射文件的sql id一致 3.接口的输入参数必需与映射文件的parameter ...
- 类的继承和C3算法
在Python的新式类中,方法解析顺序并非是广度优先的算法,而是采用C3算法,只是在某些情况下,C3算法的结果恰巧符合广度优先算法的结果. 可以通过代码来验证下: class NewStyleClas ...