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]第一次 ...
随机推荐
- Java上使用Lombok插件简化Getter、Setter方法
Maven引入依赖: <dependencies> <dependency> <groupId>org.projectlombok</groupId> ...
- msyql null 引起的错误
mysql 默认值不要为null,最好为空 否则,当你查询的时候,会引起一些异常 比如 select * from a where b!='new' 假设有一条数据b=null,你是查询不出来的 解 ...
- Java中Void占位符的測试及个人理解
Java对Void类的说明是:Void 类是一个不可实例化的占位符类,它保持一个对代表 Java keyword void 的 Class 对象的引用. 代表的是: 代表主要的 Java 类型 voi ...
- php简单的连接数据库
<?php $conn=@mysql_connect("localhost","root","") or die ("no& ...
- hdoj 1518 Square 【dfs】
题意:给出n个(不同长度的)棍子,问能不能将他们构成一个正方形. 策略:深搜. hdoj 1455的简化版 代码: #include <stdio.h> #include <stri ...
- springAOP注解方式实现日志操作
通过自定义注解调用方法执行日志存储: package com.zktx.platform.log2; import java.lang.reflect.Method; import java.util ...
- h5-8 canvas
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- linux logo的格式【转】
本文转载自:http://blog.csdn.net/xiayu98020214/article/details/7394100 =================================== ...
- 写一个类似淘宝的ios app需要用到哪些技术?
写一个类似淘宝的ios app需要用到哪些技术? 让我想起了有人私信我,说不缺钱,做个类似知乎的东西,包括加运营,需要多少钱. 扯淡结束,正好最近看了一点这方面的东西,也许对题主来说有点帮助. 手机淘 ...
- javascript设计模式-继承
javascript继承分为两种:类式继承(原型链.extend函数).原型式继承(对继承而来的成员的读和写的不对等性.clone函数). 类式继承-->prototype继承: functio ...