传送门

题目分析

考虑将大矩阵的每个1*q矩阵哈希值求出,然后让小矩阵的第一行在大矩阵中找,如果找到,并且能匹配所有行则出现过。否则没出现过。

在初始化1*q矩阵时可以进行优化:假设该行为123456,要求1*5的矩阵哈希值,可以先暴力求出1~5,为 $1 * H^4 + 2 * H^3 + 3 * H^2 + 4 * H + 5$,现在要删除1添加6:变为$2 * H^4 + 3 * H^3 + 4 * H^2 + 5 * H + 6$,也就是先减去1的哈希值乘以$H^{len - 1}$,然后乘以H,加上6的哈希值。代码如下:

  for(int i = ; i <= n; i++){
for(int k = ; k <= q; k++)
fixedHash[i][] = fixedHash[i][] * H + getVal(matrix[i][k]);
for(int j = ; j <= m - q + ; j++)
fixedHash[i][j] = (fixedHash[i][j - ] - getVal(matrix[i][j - ]) * poww[q - ]) * H + getVal(matrix[i][j + q - ]);
}

code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std; const int N = ;
typedef unsigned long long ull;
const ull H = ;
ull fixedHash[N][N], hash[], poww[];
int n, m, T, p, q, k;
char matrix[N][N], small[][]; inline int getVal(char x){
return x == '*' ? : ;
} inline bool check(int x, int y){
for(int k = x + ; k <= x + p - ; k++)
if(fixedHash[k][y] != hash[k - x + ])
return false;
return true;
} int main(){
freopen("h.in", "r", stdin);
poww[] = ;
for(int i = ; i <= ; i++) poww[i] = poww[i - ] * H;
while(scanf("%d%d%d%d%d", &n, &m, &T, &p, &q), n + m + T + p + q){
memset(matrix, , sizeof matrix);
for(int i = ; i <= n; i++) scanf("%s", matrix[i] + );
memset(fixedHash, , sizeof fixedHash);
for(int i = ; i <= n; i++){
for(int k = ; k <= q; k++)
fixedHash[i][] = fixedHash[i][] * H + getVal(matrix[i][k]);
for(int j = ; j <= m - q + ; j++)
fixedHash[i][j] = (fixedHash[i][j - ] - getVal(matrix[i][j - ]) * poww[q - ]) * H + getVal(matrix[i][j + q - ]);
}
int cnt = ;
for(int i = ; i <= T; i++){
memset(small, , sizeof small);
for(int j = ; j <= p; j++)
scanf("%s", small[j] + );
memset(hash, , sizeof hash);
for(int j = ; j <= p; j++)
for(int k = ; k <= q; k++)
hash[j] = hash[j] * H + getVal(small[j][k]);
bool flag = true;
for(int j = ; j <= n - p + ; j++){
for(int k = ; k <= m - q + ; k++){
if(fixedHash[j][k] == hash[])
if(check(j, k)){
cnt++;
flag = false;
break;
}
}
if(!flag) break;
}
}
printf("Case %d: %d\n", ++k, cnt);
}
}

【poj3690】Constellations 哈希的更多相关文章

  1. POJ3690:Constellations(二维哈希)

    Constellations Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6822   Accepted: 1382 题目 ...

  2. POJ3690 Constellations 【KMP】

    Constellations Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5044   Accepted: 983 Des ...

  3. POJ3690 Constellations

    嘟嘟嘟 哈希 刚开始我一直在想二维哈希,但发现如果还是按行列枚举的话会破坏子矩阵的性质.也就是说,这个哈希只能维护一维的子区间的哈希值. 所以我就开了个二维数组\(has_{i, j}\)表示原矩阵\ ...

  4. POJ 3690 Constellations (哈希)

    题意:给定上一n*m的矩阵,然后的t个p*q的小矩阵,问你匹配不上的有多少个. 析:可以直接用哈希,也可以用AC自动机解决. 代码如下: #pragma comment(linker, "/ ...

  5. POJ3690:Constellations——题解

    http://poj.org/problem?id=3690 题目大意:给一个图和几个子图,判断有多少种子图在原图出现过. —————————————————————— 二维哈希即可,操作看代码,我觉 ...

  6. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  7. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  8. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  9. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

随机推荐

  1. Mysql5.7.19压缩版安装步骤及踩过的坑

    安装Mysql5.7.19压缩版 一:下载压缩包 1.从MySQL官网下载MySQL Community Server 5.7.19,此版本为免费版. 2.下载完成之后解压缩,打开之后文件夹如下:   ...

  2. cocos2d-x 3.x游戏开发学习笔记(1)--mac下配置cocos2d-x 3.x开发环境

    打开用户文件夹下.bash_profile文件,配置环境 vim ~/.bash_profile //按键i,进行插入编辑(假设输错d进行删除一行) 环境配置过程例如以下: 1.首先配置下androi ...

  3. R语言- 基本统计分析

    目的: 1.描述性统计分析 2.频数表和;列连表 3.相关系数和协方差 4.t检验 5.非参数统计 在上一节中使用了图形来探索数据,下一步就是给出具体的数据来描述每个变量的分布和关系 1.描述性统计分 ...

  4. docker中发布springboot

    http://note.youdao.com/noteshare?id=81a603b1b33731aaef7b7755c70f33fb

  5. fatfs输出目录

    利用fatfs文件系统, 如何输出SD卡根目录下的各个文件夹名字呢? 程序如下: u8 Dirname_i; u8 Dirname_j; DIR dir; //读取txt里的目录用,还是要把fatfs ...

  6. web服务器软件(Nginx,Apache,IIS,Lighttpd)介绍

    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在 ...

  7. js进阶 12-17 jquery实现鼠标左键按下拖拽功能

    js进阶 12-17 jquery实现鼠标左键按下拖拽功能 一.总结 一句话总结:监听的对象必须是文档,鼠标按下运行mousemove事件,鼠标松开取消mousemove事件的绑定,div的偏移的话是 ...

  8. mysql三种带事务批量插入

    原文:mysql三种带事务批量插入 c#之mysql三种带事务批量插入 前言 对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到 ...

  9. widow下svn上传项目时的文件可执行权限问题

    还是项目上发现的问题,要上传Android的源码项目.这里客户端是windows的机器, 测试后发现俩个问题. 1. 文件后缀是.so的文件默认上传不了.    2. 文件后缀是.sh的文件,上传后, ...

  10. get_mysql_conn_info.py

    #!/usr/bin/env python#-*- encoding: utf8 -*- import xlrd """此模块作用:从excel文件获取数据库连接信息,第 ...