Matrix Matcher UVA - 11019AC_自动机 + 代价提前计算
Code:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn=103;
const int maxd=1005;
const int maxc=maxd*10;
const int sigma=28;
char A[maxd][maxd],B[maxn];
int ans[maxd][maxd];
int N,M,X,Y;
# define pb push_back
struct AC{
int ch[maxc][50],f[maxc];
vector<int>G[maxc];
queue<int>Q;
int cnt=0;
int idx(char t){return t-'a';}
void init(){
memset(ch,0,sizeof(ch));
memset(f,0,sizeof(f));
memset(ans,0,sizeof(ans));
for(int i=0;i<maxc;++i)G[i].clear();
cnt=0;
}
void insert(char T[],int u){
int n=strlen(T);
int j=0;
for(int i=0;i<n;++i){
int a=idx(T[i]);
if(!ch[j][a])ch[j][a]=++cnt;
j=ch[j][a];
}
G[j].pb(u);
}
void getfail(){
for(int i=0;i<=sigma;++i)if(ch[0][i]){Q.push(ch[0][i]);}
while(!Q.empty()){
int r=Q.front();Q.pop();
for(int i=0;i<=sigma;++i){
int u=ch[r][i];
if(!u){ch[r][i]=ch[f[r]][i];continue;}
Q.push(u);
int v=f[r];
f[u]=ch[v][i];
}
}
}
void operate()
{
for(int i=0;i<N;++i)
{
int p=0;
for(int j=0;j<M;++j){
int c=idx(A[i][j]);
p=ch[p][c];
int sz=G[p].size();
if(sz>0)
{
for(int g=0;g<sz;++g)
{
int h=G[p][g];
if(h<=i)ans[i-h][j-Y+1]+=1;
}
}
}
}
}
}op;
int main(){
int T;scanf("%d",&T);
while(T--){
op.init();
scanf("%d%d",&N,&M);
for(int i=0;i<N;++i)scanf("%s",A[i]);
scanf("%d%d",&X,&Y);
for(int i=0;i<X;++i){scanf("%s",B);op.insert(B,i);}
op.getfail();
op.operate();
int fin=0;
for(int i=0;i<N;++i)
for(int j=0;j<M;++j)
if(ans[i][j]==X)++fin;
printf("%d\n",fin);
}
return 0;
}
Matrix Matcher UVA - 11019AC_自动机 + 代价提前计算的更多相关文章
- [bzoj2726][SDOI2012]任务安排 ——斜率优化,动态规划,二分,代价提前计算
题解 本题的状态很容易设计: f[i] 为到第i个物件的最小代价. 但是方程不容易设计,因为有"后效性" 有两种方法解决: 1)倒过来设计动态规划,典型的,可以设计这样的方程: d ...
- UVA 11019 Matrix Matcher(ac自动机)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA11019 Matrix Matcher (AC自动机)
二维的矩阵匹配,把模式矩阵按列拆开构造AC自动机,记录行号(为了缩点判断). 把T矩阵按行匹配,一旦匹配成功,在假想的子矩阵左上角位置加一.最后统计总数. 因为所有模式串长度一样,不用维护last数组 ...
- 洛谷 P2365 任务安排_代价提前计算 + 好题
最开始,笔者将状态 fif_{i}fi 定义为1到i的最小花费 ,我们不难得到这样的一个状态转移方程,即 fi=(sumti−sumtj+S+Costj)∗(sumfi−sumfj)f_{i}=(s ...
- UVA - 1625 Color Length[序列DP 提前计算代价]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
- UVA 11019 Matrix Matcher 矩阵匹配器 AC自动机 二维文本串查找二维模式串
链接:https://vjudge.net/problem/UVA-11019lrjP218 matrix matcher #include<bits/stdc++.h> using na ...
- BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]
2726: [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 868 Solved: 236[Submit][Status ...
- 费用提前计算相关的DP(BZOJ2037,POJ3042,ZOJ3469)
在刷ZeroClock大神的区间DP专辑,遇见了ZOJ3469,完全不无从下手,然后有人说是论问题,推荐看徐源盛<对一类动态规划问题的研究>这篇论文,果断得膜拜了下,感觉好神奇,可以把未来 ...
- UVa 11019 (AC自动机 二维模式串匹配) Matrix Matcher
就向书上说得那样,如果模式串P的第i行出现在文本串T的第r行第c列,则cnt[r-i][c]++; 还有个很棘手的问题就是模式串中可能会有相同的串,所以用repr[i]来记录第i个模式串P[i]第一次 ...
随机推荐
- Codeforces 902D/901B - GCD of Polynomials
传送门:http://codeforces.com/contest/902/problem/D 本题是一个数学问题——多项式整除. 对于两个整数a.b,求最大公约数gcd(a,b)的辗转相除法的函数如 ...
- win7的目录和vbox的共享,linux中没有权限打开
来自于 http://www.cnblogs.com/usegear/p/5120427.html win7的目录由vbox共享是个老话题.稳拿网上很多介绍. 在linux中通过文件夹不能打开,说没有 ...
- SBC37x交叉编译平台QT+OPENCV【1】
在win7下安装Vbox虚拟机,然后安装Ubuntu10.04版本.上一篇说了根据厂商提供的编译器进行安装. 接下来要说的的环境准备.因为在Linux下对u盘的识别以及目录的共享,还有代码的编译传送运 ...
- 使用MySQL Migration Toolkit快速导入Oracle数据
近来笔者有项目需要将原有的Oracle数据库中的数据导入到MySQL中,经过试用发现MySQL GUI Tools中的MySQL Migration Toolkit可以非常方便快捷的将Oracle数据 ...
- mysql explain介绍
mysql环境优化: 1.如果order by 没有利用到索引,那么将会出现fileSort,如果sort_buffer不够大,fileSort过程则需要使用临时文件 ,fileSort优化,主要通过 ...
- 0929关于MySQL操作规范(总结)
用户权限管理 创建用户 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: Username所创建的用户名 host 指定该用 ...
- 如何实现网卡bond
https://jingyan.baidu.com/article/375c8e19da666325f2a229f7.html
- netty 学习记录一
近期在学习netty相关知识,认为<netty 权威指南>这本书还是挺好的,适合我这样的刚開始学习的人.加上netty本身自带的很多样例,学起来还是挺有兴趣的.简单记录下, 一般serve ...
- GitLab创建项目
创建自己的项目:通过地址进入 在文件夹下使用git bash进行 git init,然后ctrl+右键使用TortoiseGit>右键setting 然后再右键setting 拷贝代码时注意要h ...
- 热修复JSPatch之实战教程
接上篇<热修复JSPatch之接口设计>,在这篇文章主要给大家讲述一下怎样高速具备热修复能力,当然了假设有人有志于把JSPatch系统的学习,甚至用JSPatch进行开发的.就没有必要 ...