POJ3690 Constellations
嘟嘟嘟
哈希
刚开始我一直在想二维哈希,但发现如果还是按行列枚举的话会破坏子矩阵的性质。也就是说,这个哈希只能维护一维的子区间的哈希值。
所以我就开了个二维数组\(has_{i, j}\)表示原矩阵\(s_{i, j - q + 1}\)到\(s_{i, j}\)的哈希值,所以这个要用滚动哈希。
滚动哈希就是这样的:\(hash[s_{i, i + m}] = hash[s_{i + 1, j + m + 1}] * base - s_i * base ^ m\)。理解起来就是把\(s_i\)对哈希的贡献减去。
然后用同样的方法算出\(p * q\)矩阵的哈希值。最后逐行比对。
时间复杂度瓶颈在于比对复杂度\(O(n ^ 2 * p)\)。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
const ull bas = 19260817;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 1e3 + 5;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
int n, m, t, p, q;
char tp[maxn];
ull has[maxn][maxn], a[maxn];
bool judge()
{
for(int i = 1; i <= n - p + 1; ++i)
for(int j = q; j <= m; ++j)
{
bool flg = 1;
for(int k = 1; k <= p && flg; ++k)
if(has[i + k - 1][j] != a[k]) flg = 0;
if(flg) return 1;
}
return 0;
}
ull quickpow(ull a, int b)
{
ull ret = 1;
for(; b; b >>= 1, a *= a)
if(b & 1) ret *= a;
return ret;
}
int main()
{
int tcnt = 0;
while(scanf("%d", &n) && n)
{
m = read(); t = read(); p = read(); q = read();
for(int i = 1; i <= n; ++i)
{
scanf("%s", tp + 1);
for(int j = 1; j <= m; ++j)
{
has[i][j] = has[i][j - 1] * bas + tp[j];
if(j >= q + 1) has[i][j] -= quickpow(bas, q) * tp[j - q];
}
}
int ans = 0;
while(t--)
{
for(int i = 1; i <= p; ++i)
{
a[i] = 0;
scanf("%s", tp + 1);
for(int j = 1; j <= q; ++j) a[i] = a[i] * bas + tp[j];
}
if(judge()) ans++;
}
printf("Case %d: %d\n", ++tcnt, ans);
}
return 0;
}
POJ3690 Constellations的更多相关文章
- POJ3690 Constellations 【KMP】
Constellations Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5044 Accepted: 983 Des ...
- POJ3690:Constellations(二维哈希)
Constellations Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6822 Accepted: 1382 题目 ...
- POJ3690:Constellations——题解
http://poj.org/problem?id=3690 题目大意:给一个图和几个子图,判断有多少种子图在原图出现过. —————————————————————— 二维哈希即可,操作看代码,我觉 ...
- 【poj3690】Constellations 哈希
传送门 题目分析 考虑将大矩阵的每个1*q矩阵哈希值求出,然后让小矩阵的第一行在大矩阵中找,如果找到,并且能匹配所有行则出现过.否则没出现过. 在初始化1*q矩阵时可以进行优化:假设该行为123456 ...
- POJ3690+位运算
题意:给定一个01矩阵.T个询问,每次询问大矩阵中是否存在这个特定的小矩阵. /* 64位的位运算!!! 题意: 给定一个01矩阵.T个询问,每次询问大矩阵中是否存在这个特定的小矩阵. (64位记录状 ...
- [poj] 3690 Constellations || 矩阵hash
原题 在大矩阵里找有几个小矩阵出现过,多组数据 将t个矩阵hash值放入multiset,再把大矩阵中每个hash值从multiset里扔出去,这样最后剩在multiset里的值就是没有找到的小矩阵, ...
- POJ 3690 Constellations (哈希)
题意:给定上一n*m的矩阵,然后的t个p*q的小矩阵,问你匹配不上的有多少个. 析:可以直接用哈希,也可以用AC自动机解决. 代码如下: #pragma comment(linker, "/ ...
- iOS开发系列--打造自己的“美图秀秀”
--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...
- CSS Sprites+CSS3 Icon Font
CSS Sprites+CSS3 Icon Font CSS Sprites在国内很多人叫CSS精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来, ...
随机推荐
- js只允许输入数字和两位小数
一.js只允许输入数字和两位小数 //只允许输入数字和两位小数 function clearNoNum(obj) { obj.value = obj.value.replace(/[^\d.]/g, ...
- Spring Boot学习笔记(一)与JSP整合
项目结构展示 在webapp目录下面手动创建JSP的目录和web.xml 创建web.xml只是为了不报错,在SpringBoot的项目中实际上用不到web.xml 打开pom.xml把框住的地方改成 ...
- 深入辨析jvm内存区域
Java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域: 程序计数器.虚拟机栈.本地方法栈.Java堆.方法区(运行时常量池).直接内存 程序计数器 当 ...
- stringstream快速实现String和int之间的转换
需要包含头文件”sstream” #include <iostream> #include <string> #include <sstream> using na ...
- POJ 2524(并查集)
这道题多了一个检查是否包含所有元素 可以设一个cnt表示集合里的数量,再与外面比较 #include <cstdio> #include <iostream> #include ...
- 理解js中bind方法的使用
提到bind方法,估计大家还会想到call方法.apply方法:它们都是Function对象内建的方法,它们的第一个参数都是用来更改调用方法中this的指向.需要注意的是bind 是返回新的函数,以便 ...
- Django——REST framework
1. 什么是REST REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审 ...
- <Android 应用 之路> 百度地图API使用(4)
前言 百度地图的定位功能和基础地图功能是分开的,使用的是另外的jar包和so库文件,详情请关注官网: 百度定位SDK 配置 下载对应的jar包和so库,然后移动到lib目录下 AS中注意事项 sour ...
- latex 图形的放置
Next: 16.3 清除未处理的浮动图形 Up: 16. 浮动图形环境 Previous: 16.1 创建浮动图形 16.2 图形的放置 图形(figure)环境有一个可选参数项允许用户 ...
- QT开发(一)Vs2013集成 QT5.3.1
原文:http://www.cnblogs.com/aoldman/p/3860837.html 很久不写随笔了,真是越来越懒.最近公司要做一款产品,想使用QT不用WPF lol,让苦逼的.net的我 ...