http://acm.hust.edu.cn/vjudge/problem/33057 题意:在二维文本串T中查找一个二维模板串P出现了多少次. 题解: 拆分模板串P的每一行,建AC自动机.拆分文本串T的每一行,在自动机中与P匹配,ct[i][j]表示以点(i,j)为左上角.与P等大的矩形有多少个对应的行与P匹配.最后ct[i][j]==P的行数的i,j就是一个匹配点,ans++.注意:1.原本我在trie的叶子用动态数组维护了一个表示这一行是P的第几行的数组,但是超时了,后来看了LRJ的代码,…
UVA11019 Martix Matcher 题目描述: 给定一个\(n*m\)的文本串 问一个\(x*y\)的模式串出现的次数 AC自动机的奇妙使用 将\(x*y\)的模式串拆分成x个串,当x个串在同时被匹配时,认为原串被匹配 但是要区分匹配的行的差别,因此额外的附加一个二维数组\(cnt\)来表示匹配情况 记\(cnt(i,j)\)表示以\((i,j)\)为左上角的大小为\(x*y\)矩阵匹配了多少行. 将模式串拆成x个串,建成AC自动机 把文本串的n行放进去分别匹配,当枚举到文本串中的第…
二维的矩阵匹配,把模式矩阵按列拆开构造AC自动机,记录行号(为了缩点判断). 把T矩阵按行匹配,一旦匹配成功,在假想的子矩阵左上角位置加一.最后统计总数. 因为所有模式串长度一样,不用维护last数组. 模式串可能有重复,结点要用vector来存. HASH出奇迹,快得不行... #include<bits/stdc++.h> using namespace std; ,maxm = ; char Text[maxn][maxn], pattern[maxm]; ; int nds; int…
LINK1 LINK2 题目大意 让你在一个大小为\(n*m\)的矩阵中找大小是\(x*y\)的矩阵的出现次数 思路1:Hash hash思路及其傻逼 你把一维情况扩展一下 一维是一个bas,那你二维就用两个bas好了 对一个在\((i,j)\)的字符,令他的hash值是\(c_{i,j}*bas1^i*bas2^j\) 然后算出矩阵hash值乘上差量判断就做完了 70ms //Author: dream_maker #include<bits/stdc++.h> using namespac…
思路 AC自动机匹配二维模式串的题目 因为如果矩形匹配,则每一行都必须匹配,考虑对于一个点,设count[i][j]记录以它为左上角的与模式矩形大小相同的矩形中有多少行和模式矩形匹配 然后把模式矩形的每一行插入AC自动机中,把文本矩形的每一行在上面跑,如果文本矩形第i行和模式矩形第c行匹配,匹配位置是j,则更新 counts[i-c+1][j+1-y+1] 最后每个count[i][j]等于x的(i,j)就是一个符合条件的点 小心重复的模式串. 代码 #include <cstdio> #in…
1.HDU 2222 Keywords Search 模板题 #include <bits/stdc++.h> #define fir first #define sec second #define EPS 1e-12 using namespace std; typedef long long LL; typedef pair<int , int > pii; ; struct Trie{ ],fail[MAXN],ed[MAXN]; int root,L; int newno…
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3695/ 不加last指针的AC自动机会T,原因是他费了很多功夫在跳转上,而last指针是直接直到跳转的终止位置,直接跳转到终止位置上,所以只有一次跳转.未优化的fail指针最坏的情况下复杂度是O(|S|*|T|),其中|S|是模式串长度的均值,|T|是文本串的 长度. 代码如下: #include<bits/stdc++.h> using namespace std; #define LL long lon…
题意 问一个字符串中包含多少种模式串,该字符串的反向串包含也算. 思路 解析一下字符串,简单. 建自动机的时候,通过fail指针建立trie图.这样跑图的时候不再跳fail指针,相当于就是放弃了fail指针. 跑的时候,已经走过的模式串不能二次计数. 代码 附赠一大波样例 #include <iostream> #include <stdio.h> #include <queue> #include <string.h> using namespace st…
题中有一个坑点,就是模式串可以相同,并且全部计数. #include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; const int N=maxn; char str[maxn]; struct Dfa { int trie[N][26],cnt; int e[N]; int fail[N]; char ch; void init(char c) { memset(trie,0,sizeof(trie)); memse…
摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用有哪些? 例题解析 什么是AC自动机? 什么是AC自动机,不是自动AC的机器(想的美),而是一种多模匹配算法,英文名称Aho-Corasick automaton(前面的一串据说是一位科学家的名字),于1975年诞生于贝尔实验室. 回忆之前的KMP算法解决的一类问题是给出一个模板和一个文本串,问这一…