思路

AC自动机匹配二维模式串的题目

因为如果矩形匹配,则每一行都必须匹配,考虑对于一个点,设count[i][j]记录以它为左上角的与模式矩形大小相同的矩形中有多少行和模式矩形匹配

然后把模式矩形的每一行插入AC自动机中,把文本矩形的每一行在上面跑,如果文本矩形第i行和模式矩形第c行匹配,匹配位置是j,则更新 counts[i-c+1][j+1-y+1]

最后每个count[i][j]等于x的(i,j)就是一个符合条件的点

小心重复的模式串。

代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <queue>
  5. #include <vector>
  6. using namespace std;
  7. int Trie[10100][26],fail[10100],counts[1010][1010],root,Nodecnt,x,y,n,m;
  8. char s[1010][1010],t[110][110];
  9. vector<int> isend[10100];
  10. void insert(char *s,int len,int inq){
  11. int o=root;
  12. for(int i=0;i<len;i++){
  13. if(!Trie[o][s[i]-'a'])
  14. Trie[o][s[i]-'a']=++Nodecnt;
  15. o=Trie[o][s[i]-'a'];
  16. }
  17. isend[o].push_back(inq);
  18. }
  19. queue<int> q;
  20. void build_AC(void){
  21. for(int i=0;i<26;i++){
  22. if(Trie[root][i]){
  23. fail[Trie[root][i]]=root;
  24. q.push(Trie[root][i]);
  25. }
  26. }
  27. while(!q.empty()){
  28. int x=q.front();
  29. q.pop();
  30. for(int i=0;i<26;i++){
  31. if(Trie[x][i]){
  32. fail[Trie[x][i]]=Trie[fail[x]][i];
  33. q.push(Trie[x][i]);
  34. }
  35. else
  36. Trie[x][i]=Trie[fail[x]][i];
  37. }
  38. }
  39. }
  40. void query(char *s,int len,int inq){
  41. int o=root;
  42. for(int i=0;i<len;i++){
  43. o=Trie[o][s[i]-'a'];
  44. int p=o;
  45. while(p){
  46. if((isend[p].size()))
  47. for(int j=0;j<isend[p].size();j++)
  48. if((inq-isend[p][j]+1)>=1&&(i+1-y+1>=1))
  49. counts[inq-isend[p][j]+1][i+1-y+1]++;
  50. p=fail[p];
  51. }
  52. }
  53. }
  54. void init(void){
  55. memset(Trie,0,sizeof(Trie));
  56. memset(fail,0,sizeof(fail));
  57. memset(counts,0,sizeof(counts));
  58. for(int i=0;i<=Nodecnt;i++)
  59. isend[i].clear();
  60. Nodecnt=0;
  61. root=0;
  62. }
  63. int main(){
  64. freopen("test.in","r",stdin);
  65. freopen("test.out","w",stdout);
  66. int T;
  67. Nodecnt=0;
  68. root=0;
  69. scanf("%d",&T);
  70. while(T--){
  71. scanf("%d %d",&n,&m);
  72. for(int i=1;i<=n;i++)
  73. scanf("%s",s[i]);
  74. scanf("%d %d",&x,&y);
  75. for(int i=1;i<=x;i++){
  76. scanf("%s",t[i]);
  77. insert(t[i],y,i);
  78. }
  79. build_AC();
  80. for(int i=1;i<=n;i++){
  81. query(s[i],m,i);
  82. }
  83. int ans=0;
  84. for(int i=1;i<=n;i++)
  85. for(int j=1;j<=m;j++)
  86. if(counts[i][j]==x)
  87. ans++;
  88. printf("%d\n",ans);
  89. init();
  90. }
  91. return 0;
  92. }

UVA11019 Matrix Matcher的更多相关文章

  1. UVA11019 Matrix Matcher【hash傻逼题】【AC自动机好题】

    LINK1 LINK2 题目大意 让你在一个大小为\(n*m\)的矩阵中找大小是\(x*y\)的矩阵的出现次数 思路1:Hash hash思路及其傻逼 你把一维情况扩展一下 一维是一个bas,那你二维 ...

  2. UVA11019 Matrix Matcher (AC自动机)

    二维的矩阵匹配,把模式矩阵按列拆开构造AC自动机,记录行号(为了缩点判断). 把T矩阵按行匹配,一旦匹配成功,在假想的子矩阵左上角位置加一.最后统计总数. 因为所有模式串长度一样,不用维护last数组 ...

  3. UVA 11019 Matrix Matcher 矩阵匹配器 AC自动机 二维文本串查找二维模式串

    链接:https://vjudge.net/problem/UVA-11019lrjP218 matrix matcher #include<bits/stdc++.h> using na ...

  4. UVA11019 Martix Matcher --- AC自动机

    UVA11019 Martix Matcher 题目描述: 给定一个\(n*m\)的文本串 问一个\(x*y\)的模式串出现的次数 AC自动机的奇妙使用 将\(x*y\)的模式串拆分成x个串,当x个串 ...

  5. 【UVA11019】Matrix Matcher

    Description Given an N × M matrix, your task is to find the number of occurences of an X × Y pattern ...

  6. AC自动机(二维) UVA 11019 Matrix Matcher

    题目传送门 题意:训练指南P218 分析:一行一行的插入,一行一行的匹配,当匹配成功时将对应子矩阵的左上角位置cnt[r][c]++;然后统计 cnt[r][c] == x 的数量 #include ...

  7. UVA 11019 Matrix Matcher(ac自动机)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. UVa 11019 (AC自动机 二维模式串匹配) Matrix Matcher

    就向书上说得那样,如果模式串P的第i行出现在文本串T的第r行第c列,则cnt[r-i][c]++; 还有个很棘手的问题就是模式串中可能会有相同的串,所以用repr[i]来记录第i个模式串P[i]第一次 ...

  9. uva 11019 Matrix Matcher

    题意:给出一个n*m的字符矩阵T,你的任务是找出给定的x*y的字符矩阵P在T中出现了多少次. 思路:要想整个矩阵匹配,至少各行都得匹配.所以先把P的每行看做一个模式串构造出AC自动机,然后在T中的各行 ...

随机推荐

  1. ruby 知识点随笔

    print .puts 和 p 方法的区别."" 与 ''  的区别. 处理控制台编码问题 >ruby -E utf-8 脚本文件名称 # 执行脚本 >irb -E u ...

  2. eclipse哪个版本好

    Eclipse IDE for Java EE Developers (企业级开发软件,干啥都足够了,300MB左右)

  3. 用vue制作饿了么首页(1)

    无论是静态网页还是动态交互网页,实现原则是将他们分块,然后各个击破. 很明显的饿了么首页分为三个部分(组件), 上面的头部(商家信息), 中间路由 购物车 每部分先占住自己位置,然后挨个将这三部分分别 ...

  4. Matplotlib学习

    决定通过一个个例子来实践并掌握Matplotlib.. 例子1. 画一个散点图,数据分布如下: import numpy as np import pandas as pd import matplo ...

  5. ie9 remove出错 jquery SCRIPT5007: 缺少对象

    针对IE11 remove不起作用的问题. 其中IE11.0.37也不支持 IE11.0.42支持可能是由于客户机器设置了兼容模式的原因. 因为里面包含了object元素,移除数据的时候发生的bug. ...

  6. python全栈开发 * 18 面向对象知识点汇总 * 180530

    18 面向对象初识1class person: level="高级动物" mind="有思想" def __init__(self,name,age,gent, ...

  7. TXT电子书格式怎样转换成epub格式

    怎样将TXT电子书格式转换成epub格式呢?因为很多时候不同的阅读器所支持的电子书格式是有所不同,所以电子书格式转换的问题,在生活中也是会经常出现的问题.如果我们需要将TXT电子书格式转换成epub格 ...

  8. EF Unknown column 'Project1.FamilyMembers_ID' in 'field list'

    产生成的查询语句中有:Project1.FamilyMembers_ID 字段 原因:就是对象主键对象中有一个属性!

  9. HTTP协议实际使用笔记

    mozilla的帮助文档: https://developer.mozilla.org/zh-CN/docs/Web/HTTP HTTP协议详解(转) php http头设置相关信息 这个2篇最好先看 ...

  10. Python IDLE arcpy设置环境变量

    在IDLE中 import arcpy help(arcpy) 得到的路径为: 但是在arcmap中,路径为: 说明IDLE的环境变量设置有问题: 在windows的环境变量中设置环境变量PYTHON ...