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自动机.拆分文本串 ...
随机推荐
- 2018ACM山东省赛 Games(dp取数)
Games Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description Alice and Bob ...
- HDU - 3664 Permutation Counting 排列规律dp
Permutation Counting Given a permutation a1, a2, … aN of {1, 2, …, N}, we define its E-value as the ...
- BDBR vs BDPSNR 计算方法 (转载)
转自:http://blog.csdn.net/menyangyang/article/details/42874575
- sqlserver2012——逻辑运算符
ALL 如果一组的比较都为TRUE,则结果为true ANY如果玉足比较中任何一个为true,则结果为true AND 两个boll都为TRUE,则结果为TRUE OR 两个BOLL任何一个TRUE, ...
- 通过ssh X11转发使用远程gui程序
ssh协议可以转发X11数据, 从而达到使用远程gui程序的功能, 假定现在有 客服端 C :192.168.0.13 服务器 S :192.168.0.200 首先确保在客服端C 上能够通过 ssh ...
- IDEA如何找到接口的实现类
如何找到接口的实现类 (IDEA))在ApplicationContext上右击 Diagrams ->show diagram 可以看到继承关系: 在ApplicationContext上右击 ...
- Mujin Programming Challenge 2017A - Robot Racing【思维题】
题意: 给你n个人的位置,每个人能往后跳一格或两格到无人的位置,跳到0位置,这个人消失,n个人消失组成一个排列,问有多少种排列. 思路: 额,搞了一整场这个A...代码也巨挫了. 处理成1,3,5,7 ...
- iOS 根据文字字数动态确定Label宽高
iOS7中用以下方法 - (CGSize)sizeWithAttributes:(NSDictionary *)attrs; 替代过时的iOS6中的- (CGSize)sizeWithFont:(UI ...
- Java与Javac版本不一致问题解决方案
问题:在自己电脑上运行java -version和javac -version,发现java版本不一致,然后查看了环境变量,JAVA_HOME 是 C:\Program Files(x86)\Java ...
- 洛谷2414(构建ac自动机fail树dfs序后遍历Trie树维护bit及询问答案)
要点 这是一道蔡队题,看我标题行事 任意询问y串上有多少个x串,暴力找每个节点是不是结尾肯定是炸的,考虑本质:如果某节点是x的结尾,根据ac自动机的性质,x一定是此(子)串后缀.又有每个Trie节点的 ...