UVA 11019 二维匹配 AC自动机
这个题目要求在一个大矩阵里面匹配一个小矩阵,是AC自动机的灵活应用
思路是逐行按普通AC自动机匹配,用过counts[i][j]记录一下T字符矩阵以i行j列为开头的与P等大的矩阵区域 有多少行已经匹配了,显然如果该数值==p的行数,则说明匹配成功
就是在自动机的过程中,匹配得时候要稍微多想一下,每次匹配都要调用函数对 counts进行维护,以及还要注意某些行是相同的情况,用个链表保存,匹配成功后直接链过去继续对counts进行维护
最后统计counts里面有多少个值==p的行数即可得出结果
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = ;
char T[N][N];
char word[N][N];
int x,y,n,m;
int cnt,tr;
int recline[N];
int next[N];
int len[N];
int counts[N][N]; void process_match(int pos, int v) //对counts进行维护
{
int pr=recline[v-];
int c=pos-len[pr]+;//得到矩阵行和列的数值
while (pr>=){
if (tr>=pr){
counts[tr-pr][c]++;
}
pr=next[pr];//直接对下一个相同的行进行该操作
}
}
struct ACTrie
{
int ch[N*][];
int last[N*];
int val[N*];
int f[N*];
int sz;
int idx(char c){
return c-'a';
}
void init(){
memset(ch,,sizeof ch);
memset(last,,sizeof last);
memset(val,,sizeof val);
memset(f,,sizeof f);
sz=;
}
void insert(char*s,int v){
int u=;
for (int i=;s[i];i++){
int c=idx(s[i]);
if (!ch[u][c]){
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
void getfail(){
queue<int> q;
for (int i=;i<;i++)
{
int u=ch[][i];
if (u) q.push(u);
}
while (!q.empty()){
int u=q.front();
q.pop();
for (int i=;i<;i++){
int v=ch[u][i];
if (!v) continue;
q.push(v);
int p=f[u];
while (p && !ch[p][i]) p=f[p];
f[v]=ch[p][i];
last[v]=val[f[v]]?f[v]:last[f[v]];
}
}
}
void report(int pos,int j){ //匹配函数要改一下,每次匹配成功都调用该函数对counts进行维护
if (j){
process_match(pos, val[j]);
report(pos, last[j]);
}
}
void find(char* str){
int u=;
for (int i=;str[i];i++){
int c=idx(str[i]);
while (u && !ch[u][c]) u=f[u];
u=ch[u][c];
if (val[u]){
report(i,u);
}
else if (last[u])
report(i,f[u]);
} } } ACT;
int main()
{
int t;
scanf("%d",&t);
while (t--){
scanf("%d%d",&x,&y);
for (int i=;i<x;i++){
scanf("%s",T[i]);
}
scanf("%d%d",&n,&m);
ACT.init();
for (int i=;i<n;i++){
scanf("%s",word[i]);
recline[i]=i;
next[i]=-;
len[i] = strlen(word[i]);
for (int j=;j<i;j++){
if (strcmp(word[i],word[j])==){
recline[i]=j;
next[i]=next[j]; //用链表的方式保存相同的行
next[j]=i;
break;
}
}
if (recline[i]==i){
ACT.insert(word[i],i+);
}
}
ACT.getfail();
memset(counts,,sizeof counts);
for (tr=;tr<x;tr++){
ACT.find(T[tr]);
}
int ans=;
for (int i=;i<x-n+;i++)
for (int j=;j<y-m+;j++){
//cout<<i<<" !! "<<j<<" "<<counts[i][j]<<endl;
if (counts[i][j]==n)
ans++;
}
printf("%d\n",ans);
}
return ;
}
UVA 11019 二维匹配 AC自动机的更多相关文章
- UVA 11019 Matrix Matcher(ac自动机)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 简单二维元胞自动机 MATLAB实现
20世纪50年代,乌尔姆和冯·诺依曼(对此人真是崇拜的五体投地)为了研究机器人自我复制的可能性,提出了一种叫做元胞自动机(Cellular Automaton,CA)的算法.该算法采用局相互作用规则, ...
- [Alg] 文本匹配-多模匹配-AC自动机
1. 简介 AC自动机是一种多模匹配的文本匹配算法. 如果采用naive的方法,即依次比较文本串s中是否包含模式串p1, p2,...非常耗时.考虑到这些模式串中可能具有相同子串,可以利用已经比较过的 ...
- uva 11178二维几何(点与直线、点积叉积)
Problem D Morley’s Theorem Input: Standard Input Output: Standard Output Morley’s theorem states tha ...
- Substring Uva 11468_记忆化搜索 + AC自动机
Code: #include<cstdio> #include<cstring> #include<queue> using namespace std; cons ...
- 字符串——AC自动机
目录 一.前言 二.思路 三.代码 四.参考资料 一.前言 以前一直没学AC自动机,主要是被名字吓到了,自动AC,这么强的名字肯定很难,学了后才发现,其实不难. AC自动机并不是Acept autom ...
- 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...
- BZOJ2553 [BeiJing2011]禁忌 【AC自动机 + dp + 矩乘优化】
题目链接 BZOJ2553 题解 话说在前,此题卡精度,最好开long double 先建\(AC\)自动机 求期望,逆着求,设\(f[i][j]\)为长度为\(i\)的串,当前匹配AC自动机\(j\ ...
- 牛客新年AK场之模拟二维数组
链接:https://ac.nowcoder.com/acm/contest/3800/D来源:牛客网 题目描述 Rinne 喜欢使用一种奇怪的方法背单词,现在这些单词被放在了一个 n×mn \tim ...
随机推荐
- git commit -m 和 git commit -am 区别
git commit -m 和 git commit -am 通常修改一个文件 并且将文件提交到本地分支的命令是: git add . git commit -m 'update' 以上两个命令其实可 ...
- sprintf与sscanf用法举例
一.sscanf 从tmp中读取a,b,c. int main(){ ]; int a; double b; ]; while(gets(tmp) != NULL){ sscanf(tmp, &quo ...
- js实现连续输入之后发送请求
输入框是我们经常会用到的功能,想要实现输入就请求的功能 但是在实际开发中,为了减少服务器压力,会在输入之后停留1s没有输入之后再进行搜索 研究之后用原生js及表单写了一个简单的demo,如果有好的de ...
- 微服务中springboot启动问题
log4j:WARN No appenders could be found for logger (org.springframework.web.context.support.StandardS ...
- Day4-T3
原题目 吉儿是一家古董店的老板娘,由于她经营有道,小店开得红红火火.昨天,吉儿无意之中得到了散 落民间几百年的珍宝——月亮之眼.吉儿深知“月亮之眼”价值连城:它是由许多珍珠相连而成的,工 匠们用金线连 ...
- mcu运行时间估算
昨个伙计问我他那个板子的程序运行时间估算问题… 现在说一下估算的思路.首先确定有几个点,板子的主频.时钟周期,机器周期. 首先由主频f得到一个时钟周期为1/f. 再者时钟周期与机器周期有一个比例关系, ...
- 解决dispatch 后在当前页面不能获取最新的this.props中的数据
因为dispatch为异步方法 .解决这个问题方法很多 出去添加定时器这种不是很优雅的方法 我们可以用 componentWillReceiveProps(nextProps) 这个生命周期 ...
- TensorFlow2 Part1:基础
TensorFlow™是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络 ...
- 064-PHP函数中局部变量在函数外不可使用
<?php function print_num(){ //定义函数 $x=6; //在函数中定义变量 } print_num(); //调用函数 echo $x; ?>
- SQL优化工具 - SQL Server Profiler与数据库引擎优化顾问
最近项目做到几千个学生分别去人脸识别记录(目前约630000行)中查询最后一次记录,可想而知性能这块是个麻烦.于是乎,GET到了SQL Server Profiler和数据库引擎优化顾问这俩工SHEN ...