UVA11019 Matrix Matcher (AC自动机)
二维的矩阵匹配,把模式矩阵按列拆开构造AC自动机,记录行号(为了缩点判断)。
把T矩阵按行匹配,一旦匹配成功,在假想的子矩阵左上角位置加一。最后统计总数。
因为所有模式串长度一样,不用维护last数组。
模式串可能有重复,结点要用vector来存。
HASH出奇迹,快得不行。。。
#include<bits/stdc++.h>
using namespace std;
const int maxn = ,maxm = ;
char Text[maxn][maxn], pattern[maxm];
const int maxnds = maxm*maxm, sigma_size = ;
int nds;
int ch[maxnds][sigma_size];
int f[maxnds];
vector<int> val[maxnds]; void bfs()
{
f[] = ;
queue<int> q;
for(int c = ; c < sigma_size; c++){
int u = ch[][c];
if(u){ q.push(u); f[u] = ;}
}
while(q.size()){
int r = q.front(); q.pop();
for(int c = ; c < sigma_size; c++){
int u = ch[r][c];
if(!u) { ch[r][c] = ch[f[r]][c]; continue; }
q.push(u);
int v = f[r];
while(v && !ch[v][c]) v = f[v];
f[u] = ch[v][c];
}
}
} #define idx(x) x-'a';
void add(char *s,int i)
{
int n = strlen(s), u = ;
for(int i = ; i < n; i++){
int c = idx(s[i]);
if(!ch[u][c]){
u = ch[u][c] = nds++;
memset(ch[u],,sizeof(ch[u]));
val[u].clear();
}else u = ch[u][c];
}
val[u].push_back(i);
} void init()
{
nds = ;
memset(ch[],,sizeof(ch[]));
val[].clear();
} int cnt[maxn][maxn];
int N,M;
int X,Y; void cal(int i,int j)
{
if(i>=) cnt[i][j]++;
} void Find(char *T,int R)
{
int n = strlen(T), u = ;
for(int i = ; i < n; i++){
int c = idx(T[i]);
u = ch[u][c];
if(val[u].size() ){
for(auto it:val[u]){
cal(R-it+,i-Y+);
}
}
}
} int main()
{
//freopen("in.txt","r",stdin);
int T;cin>>T;
while(T--){
init();
scanf("%d%d",&N,&M);
for(int i = ; i < N; i++){
scanf("%s",Text[i]);
}
scanf("%d%d",&X,&Y);
for(int i = ; i <= X; i++){
scanf("%s",pattern);
add(pattern,i);
}
bfs();
for(int i = ; i < N; i++){
Find(Text[i],i);
}
int ans = ;
for(int i = ; i < N; i++){
for(int j = ; j < M; j++){
if(cnt[i][j]){
if(cnt[i][j] == X) ans++;
cnt[i][j] = ;
}
}
}
printf("%d\n",ans);
}
return ;
}
UVA11019 Matrix Matcher (AC自动机)的更多相关文章
- UVA11019 Martix Matcher --- AC自动机
UVA11019 Martix Matcher 题目描述: 给定一个\(n*m\)的文本串 问一个\(x*y\)的模式串出现的次数 AC自动机的奇妙使用 将\(x*y\)的模式串拆分成x个串,当x个串 ...
- UVA11019 Matrix Matcher【hash傻逼题】【AC自动机好题】
LINK1 LINK2 题目大意 让你在一个大小为\(n*m\)的矩阵中找大小是\(x*y\)的矩阵的出现次数 思路1:Hash hash思路及其傻逼 你把一维情况扩展一下 一维是一个bas,那你二维 ...
- UVA11019 Matrix Matcher
思路 AC自动机匹配二维模式串的题目 因为如果矩形匹配,则每一行都必须匹配,考虑对于一个点,设count[i][j]记录以它为左上角的与模式矩形大小相同的矩形中有多少行和模式矩形匹配 然后把模式矩形的 ...
- Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例
摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...
- UVA 11019 Matrix Matcher 矩阵匹配器 AC自动机 二维文本串查找二维模式串
链接:https://vjudge.net/problem/UVA-11019lrjP218 matrix matcher #include<bits/stdc++.h> using na ...
- UVA 11019 Matrix Matcher(ac自动机)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 11019 Matrix Matcher ( 二维字符串匹配, AC自动机 || 二维Hash )
题目: 传送门 题意: 给你一个 n * m 的文本串 T, 再给你一个 r * c 的模式串 S: 问模式串 S 在文本串 T 中出现了多少次. 解: 法一: AC自动机 (正解) 670ms 把模 ...
- 【UVA11019】Matrix Matcher
Description Given an N × M matrix, your task is to find the number of occurences of an X × Y pattern ...
- 【uva11019-Matrix Matcher】AC自动机+优化+记录
http://acm.hust.edu.cn/vjudge/problem/33057 题意:在二维文本串T中查找一个二维模板串P出现了多少次. 题解: 拆分模板串P的每一行,建AC自动机.拆分文本串 ...
随机推荐
- VC OnCtlColor函数来修改控件背景颜色
CWnd::OnCtlColor afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ); 返回值:OnCtlColor必须 ...
- C++ 无边框的拖动窗口代码
按下鼠标时,记录下鼠标在窗体上的坐标, 同时用一个BOOL变量记录下鼠标左键按下的状态 弹起左键,则记录状态的布尔变量为FALSE. 处理鼠标移动事件,如果左键同时按下,则为鼠标拖动窗体运动,设置窗体 ...
- HDU - 4804 Campus Design(状压+轮廓线dp)
Campus Design Nanjing University of Science and Technology is celebrating its 60th anniversary. In o ...
- Zookeeper发布订阅之SpringBoot+Mybatis多数据源
1.前言 数据发布/订阅系统,即所谓的配置中心,顾名思义就是发布者将数据发布到Zookeeper的一个或一系列节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中管理和数据的动 ...
- WP之样式
1.定义资源 <Window.Resources> <!--下面用样式--> <Style x:Key="BigFontButtonStyle"> ...
- SP2-0734: 未知的命令开头 “IMP ” - 忽略了剩余的行
描述 在cmd命令窗口中使用imp命令将dmp文件导入到oracle中时,出现了错误: SP2-0734: 未知的命令开头 “IMP ” - 忽略了剩余的行,如图 原因 imp命令是oracle提供的 ...
- Litjson
http://www.cnblogs.com/peiandsky/archive/2012/04/20/2459219.html JSON(JavaScript Object Notation) 是一 ...
- 洛谷 P2327 [SCOI2005]扫雷
P2327 [SCOI2005]扫雷 https://www.luogu.org/problem/show?pid=2327 题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二 ...
- sublime text 3 的emmet 添加自定义 html 片段
比如想在html写 jquery 直接添加jquery地址,打开 ‘首选项->Package Setting->Emmet->Settings - User’, css也可以如法炮制 ...
- UML工具 PlantUML SequenceDiagram